Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell高尔夫:下一个工作日_Powershell - Fatal编程技术网

Powershell高尔夫:下一个工作日

Powershell高尔夫:下一个工作日,powershell,Powershell,如何使用powershell查找下一个工作日?好吧,我的手机允许我设置哪些工作日是工作日,但Windows/.NET不会,所以我假设从周一到周五 注意:由于问题包括“golf”,我正在打这一个,这是试图使用尽可能少的脚本字节。因此,代码不一定可读 最简单和最直接的方法是从今天开始,加上一天,看看它是否在想要的范围内: PS> $d = [DateTime]::Now.AddDays(1); while ($d.DayOfWeek -eq "Saturday" -or $d.DayOfWee

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

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

注意:由于问题包括“golf”,我正在打这一个,这是试图使用尽可能少的脚本字节。因此,代码不一定可读

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

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,我们可以保证它始终返回至少两个工作日,并保存@operator以强制数组:

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

以下是另一种管道方式:

(@(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)。

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

在一项声明中:

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

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

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

    PS>1,2-等式1

    PS>1

  • 我利用了一个事实,即计算下一个工作日的规则
    today+1
    的实际例外情况只有星期五(+3天)和星期六(+2天)


我发现第一个答案中的示例代码很难理解,所以我重写了它,以便更容易看到发生了什么。我仍然在使用-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) )

这是显而易见的。如果当前日期是星期五,则只返回一个结果(下一个星期一),该结果将作为单个对象返回,而不是作为数组返回,这就是无法使用[0]对其进行索引的原因。当您使用1..4时(顺便说一下,您可以在其周围放置@()),您将得到两个日期,也就是说,一个可以选择第一个日期的数组。另一种选择是在完整语句(请参见我的答案)周围放置@(),以强制数组(即使只有一项)再次使用[0]。我喜欢那些流水线版本,前两个版本有两个语句,多亏了lotWell,我不知道禁止使用多个语句。很好,这应该是正确的答案,但是我很快就需要这个。。。我是powershell的菜鸟;不知道日期别名:)我听起来像个傻瓜,但你可以随时更改接受的答案。不过,你最好等一等,因为也许其他人会推出更紧凑的在线服务。Microsoft Powershell团队的一些开发人员也加入了这一行列……你是对的,这是正确的答案,因此问题的标题是
$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) )