如何使用PowerShell查找下一个工作日?
答案 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) )