如何生成数组天和管道到其余的功能

时间:2014-06-09 20:59:20

标签: powershell

我想生成一个工作日列表,列出哪些天是星期五,哪些星期五是这个月的最后一天。

到目前为止,我有:

$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语句进行管道传输。

我问的可能吗?实现这一目标的最佳方法是什么?

3 个答案:

答案 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
     }
  }