我想生成一个工作日列表,列出哪些天是星期五,哪些星期五是这个月的最后一天。
到目前为止,我有:
$days = @()
for($i=0;$i -le 50;$i++){$days += (Get-Date).AddDays($i)}
$days |
where {$_.DayOfWeek -notlike 'Sunday' -and $_.DayOfWeek -notlike 'Saturday'} |
foreach{
if($_.DayOfWeek -like 'Friday'){
if($_.Month -like $_.AddDays(7).Month){
Write-Host "$_ - Fri - Not end of month"
}
else{
Write-Host "$_ - Fri - End of month"
}
}
else{
Write-Host "$_ - Mon - Thur"
}
}
这有效,但我想知道是否可以进一步管道,以便我不必声明$days
变量。
有些事情:
for($i=0;$i -le 50;$i++){(Get-Date).AddDays($i)} | where {$_.DayOfWeek...
这不起作用,因为您无法从for语句进行管道传输。
我问的可能吗?实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
您可以通过将其包装在子表达式中来从for循环进行管道传输:
$(for($i=0;$i -le 50;$i++){(Get-Date).AddDays($i)}) | where {$_.DayOfWeek...
答案 1 :(得分:1)
我看到你有一个公认的解决方案,并且mjolinor做得很好,所以我确信答案很棒,我只是想提供一个替代方案。
您可以将Where子句移动到For循环内部,如:
for($i=0;$i -le 50;$i++){(Get-Date).AddDays($i) | where {$_.DayOfWeek...}}
作为其扩展,您可以在与该日期相关的For循环中放置您想要的任何内容。此外,使用Switch循环可能更好地管理您的If / If / Else子句(至少在我看来)。要显示这两点,请考虑以下代码:
for($i=0;$i -le 50;$i++){
(Get-Date).AddDays($i)|where {$_.DayOfWeek -notlike 'Sunday' -and $_.DayOfWeek -notlike 'Saturday'} | foreach{
Switch($_){
{($_.DayOfWeek -like 'Friday') -and ($_.Month -like $_.AddDays(7).Month)}{Write-Host "$($_.ToString("MM/dd/yyyy")) - Fri: Not end of month";Continue}
{($_.DayOfWeek -like 'Friday') -and !($_.Month -like $_.AddDays(7).Month)}{Write-Host "$($_.ToString("MM/dd/yyyy")) - Fri: End of month";Continue}
Default{Write-Host "$($_.ToString("MM/dd/yyyy")) - Mon-Thur ($($_.DayOfWeek))"}
}
}
}
如果你真的想要这可以做成一行,但是它更难以阅读(就像If / If / Else子句可能是1行一样,如果你这么做就很难读)。这将输出如下内容(为简洁起见仅显示15行):
06/09/2014 - Mon-Thur (Monday)
06/10/2014 - Mon-Thur (Tuesday)
06/11/2014 - Mon-Thur (Wednesday)
06/12/2014 - Mon-Thur (Thursday)
06/13/2014 - Fri: Not end of month
06/16/2014 - Mon-Thur (Monday)
06/17/2014 - Mon-Thur (Tuesday)
06/18/2014 - Mon-Thur (Wednesday)
06/19/2014 - Mon-Thur (Thursday)
06/20/2014 - Fri: Not end of month
06/23/2014 - Mon-Thur (Monday)
06/24/2014 - Mon-Thur (Tuesday)
06/25/2014 - Mon-Thur (Wednesday)
06/26/2014 - Mon-Thur (Thursday)
06/27/2014 - Fri: End of month
答案 2 :(得分:0)
好吧,我发布这只是为了告诉他一个for循环确实可以用于管道。
DayOfWeek是一个枚举,因此具有string和int值。如果使用int值,这会容易得多:
foreach ($i in 1..50)
{
$Date = (Get-Date).AddDays($i)
$DOW = [int]$Date.DayOfWeek
if ($DOW -eq 5) {$Friday = 'Friday!!!' }
if ($Friday -and ($Date.Month -lt $Date.AddDays(7).Month))
{ $EOM = '- End of month' }
if ($DOW -match '[1-5]')
{
'{0} {1} {2}' -f $Date.ToShortDateString(),$Friday,$EOM
$Friday,$EOM = $null
}
}