Powershell 如何生成天数数组并将其传递到函数的其余部分

Powershell 如何生成天数数组并将其传递到函数的其余部分,powershell,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'){

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

到目前为止,我已经:

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


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

您可以通过将for循环包装到子表达式中,从而从for循环进行管道传输:

$(for($i=0;$i -le 50;$i++){(Get-Date).AddDays($i)}) | where {$_.DayOfWeek...

我看到你们有一个被接受的解决方案,mjolinor做了很好的工作,所以我相信答案很好,我只是想提供一个替代方案

您可以将Where子句移动到For循环的内部,如下所示:

for($i=0;$i -le 50;$i++){(Get-Date).AddDays($i) | where {$_.DayOfWeek...}}
作为扩展,您可以在与日期相关的For循环中放入任何您想要的内容。另外,您的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子句可以写一行一样,如果你写的话,读起来就困难多了)。这将输出如下内容(为简洁起见,仅显示15行):


好的,我发布了这个消息,只是为了向他展示一个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
     }
  }

别误会我的意思,我不是想骗你,你的第一个回答很简短,很甜蜜,正是他想要的。我只是提供了一个替代方案,并且拉皮条
开关
,因为我认为它没有被充分利用,而且很整洁。无意冒犯。直到你发布了另一个解决方案(这是我的投票结果),我才真正看了很多细节。我只是想展示如何利用枚举的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
     }
  }