好吧,我的手机允许我设置哪些日子是工作日,但 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