循环到当前日期的零下15天

时间:2013-08-18 04:19:10

标签: powershell powershell-v2.0 powershell-v3.0

我正在试图弄清楚什么是调用需要日期范围参数的exe的最佳方法(例如:20130801-20130815),然后将其循环以使其缩短15天并使用新日期调用exe范围。

我想过使用do,但我不确定如何(对PowerShell /编程新手)但我确信这远非正确的方法:)。我刚开始想出这个,所以提前感谢任何/所有的帮助。

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)

2 个答案:

答案 0 :(得分:4)

你可以使用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"))"

}

使用Write-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)

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

答案 1 :(得分:1)

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

0..15 | %{
  $changingDate = $startdate.AddDays(-$_)
  #do your work with the .exe & $changingDate
  $changingDate
}