Powershell Golf:下一工作日

时间:2009-06-19 16:29:24

标签: powershell

如何使用PowerShell查找下一个工作日?

4 个答案:

答案 0 :(得分:11)

好吧,我的手机允许我设置哪些天是工作日,但Windows / .NET不会,所以我假设周一到周五。

注意:由于问题包括“高尔夫”,我正在打高尔夫球,我试图尽可能少地使用脚本。结果不一定是可读的。

最简单,最直接的方法是从今天开始,添加一天,看看它是否在想要的范围内:

PS> $d = [DateTime]::Now.AddDays(1); while ($d.DayOfWeek -eq "Saturday" -or $d.DayOfWeek -eq "Sunday") { $d = $d.AddDays(1) }; $d
Montag, 22. Juni 2009 19:50:27

我们可以缩短一点,但是:

PS> $d=(Get-Date)+"1";for(;6,0-contains$d.DayOfWeek){$d+="1"}$d
Montag, 22. Juni 2009 19:52:31

但我们也可以使用管道以不同的方式尝试。下一个工作日至少有一天,最多三天,所以我们可以生成一个可能的日期列表并相应地过滤它们,最后选择第一个:

PS> @(1..3|%{(Get-Date).AddDays($_)}|?{$_.DayOfWeek -ge "Monday" -and $_.DayOfWeek -le "Friday"})[0]
Montag, 22. Juni 2009 22:11:19

或更短:

PS> @(1..3|%{(Get-Date)+"$_"}|?{1..5-contains$_.DayOfWeek})[0]
Montag, 22. Juni 2009 19:55:53

通过让范围变为4,我们可以保证它始终返回至少两个工作日并保存@运算符以强制数组:

PS> (1..4|%{(Get-Date)+"$_"}|?{1..5-contains$_.DayOfWeek})[0]
Montag, 22. Juni 2009 20:24:06

答案 1 :(得分:9)

这也很短(但使用别名):

,(1,2-eq7-(date).dayofweek)|%{(date)+"$(1+$_[0])"}

在一个单一陈述中:

(date)+"$(1+$(@(1,2-eq7-(date).dayofweek)))"

关于这种方法的一些注意事项:

  • 在Powershell(至少为v1)中,与集合的比较会返回条件为真的项目,例如:

    PS> 1,2 -eq 1
    PS> 1

  • 我正在利用以下事实:规则today + 1计算下一个工作日的实际例外仅为周五(+3天)和周六(+2天)。

答案 2 :(得分:3)

这是另一种管道方式:

(@(1..4) | foreach { if (([datetime]::Now.AddDays($_)).DayOfWeek -ne "Sunday" -and ([datetime]::Now.AddDays($_)).DayOfWeek -ne "Saturday") {[datetime]::Now.AddDays($_); }})[0]

不知道为什么我必须使用(1..4)而不是(1..3)。

答案 3 :(得分:0)

我发现第一个答案中的示例代码非常难以遵循,所以我重新编写它以便更容易看到发生了什么。我仍然使用-eq行为,其中-eq测试将返回匹配值。

$date = get-date "2013 Apr 24"

write-host "Based on your date"
$date

write-host "next business day (skipping saturday and sunday)"
$Date.AddDays(1 + $(1,2 -eq 7 - [int]$date.dayofweek) )

write-host "Next week monday"
$Date.AddDays(1 + $(0,1,2,3,4,5,6,7 -eq 7 - [int]$date.dayofweek) )