2

我试图找出调用需要日期范围参数(例如:20130801-20130815)的 exe 的最佳方法,然后循环它,使其减去 15 天并使用新的日期范围调用 exe。

我想过使用 do until 但我不确定如何(powershell/programming 的新手),但我确信这与正确的方法相去甚远:)。我刚刚开始解决这个问题,所以提前感谢任何/所有帮助。

do {

    $startDate = (Get-Date).adddays(-34)
    $requireddate = some date that is set ad-hoc
    $startdate.ToString("yyyyMMdd")

    #[datetime]::parseexact($startdate,"MMddyyyy",$null)

    Call THE EXE at this point with the parameters $startdate and $enddate

    $enddate = $startdate.AddDays(-15) 

    write-host $enddate.ToString("yyyyMMdd")
    }
until ($enddate -eq $requireddate)
4

2 回答 2

7

您也可以使用 For 循环来完成您想要实现的目标:

(我已经把东西分成了一些变量,我发现它在编写函数时很有帮助)

$requiredAddDays = 30
$requiredDate = (get-date).AddDays($requiredAddDays)
$startDate = (get-date).AddDays(-34)
$endAddDays = -15


for($i = $startDate; $i -lt $requiredDate; $i = $i.AddDays(1))
{

    Write-Output "$($i.ToString("yyyyMMdd"))-$($i.AddDays($endAddDays).ToString("yyyyMMdd"))"

}

UsingWrite-Output意味着返回的任何东西都作为对象返回(而Write-Host总是返回一个字符串)。通过返回一个对象,它可以被送入管道(使用管道|

我的 $( code) 语法Write-Output意味着括号内的任何内容都会在返回字符串(作为对象)之前进行评估。

如果您将大量使用它,您可以更进一步,使其成为参数化函数:

Function Get-DateRange
{
Param(
[datetime]$startDate,
[int]$endAddDays,
[datetime]$requiredDate
)

    for($i = $startDate; $i -lt $requiredDate; $i = $i.AddDays(1))
    {

        Write-Output "$($i.ToString("yyyyMMdd"))-$($i.AddDays($endAddDays).ToString("yyyyMMdd"))"

    }

}

然后你可以通过运行这样的东西来调用它(一旦它被加载到你的会话中):

Get-DateRange -startDate (get-Date).AddDays(-10) -endAddDays 15 -requiredDate (get-Date).AddDays(15)

PS 如果您想编写函数,如果可以的话,尝试使用典型的 Powershell 动词可能是个好主意。运行get-verb | sort verb以查看整个列表。:)

于 2013-08-19T10:42:02.157 回答
1

有很多方法。如果您想使用 Powershell 特定方法(不是 do..until 或 while(){} ),那么您可以使用管道:

0..15 | %{
  $changingDate = $startdate.AddDays(-$_)
  #do your work with the .exe & $changingDate
  $changingDate
}
于 2013-08-18T16:30:03.673 回答