如何用PowerShell打印未来4个周五的日期?解决现有脚本重复输出同一日期的问题
看起来你遇到的问题是脚本一直重复输出同一个周五的日期,我来帮你分析下问题所在,再给出修复和更优的实现方式~
问题出在哪?
你的脚本有两个关键错误导致重复输出:
- while循环的增量逻辑错误:你在while里用
$date = $date.AddDays($num),这里的$num是循环变量(从1到4),这会导致每次跳过的天数完全不对,而且第一次找到周五后,后续循环没有继续推进日期,一直停留在同一个时间点。 - 未推进到下一周:找到第一个周五后,你没有把日期往后推7天,所以每次循环都在处理同一个周五,自然输出重复的结果。
修复后的脚本
先修正逻辑,先找到第一个即将到来的周五,之后每次循环都往后推7天获取下一个周五:
$date = Get-Date # 先找到第一个即将到来的周五(如果今天是周五,就从今天开始) while ($date.DayOfWeek -ne "Friday") { $date = $date.AddDays(1) } # 循环输出4个连续的周五 for ($num = 1 ; $num -le 4 ; $num++){ $datestr = $date.ToString('dd-MM-yyyy') Write-Output $datestr $SomeVar = "Friday - $num - $datestr" Write-Output $SomeVar # 每次循环后往后推7天,得到下一个周五 $date = $date.AddDays(7) }
更简洁的实现方式
其实可以不用while循环,直接通过计算天数偏移来获取目标日期,代码更简洁高效:
$today = Get-Date # 计算到下一个周五的天数:PowerShell里DayOfWeek的数值是0(周日)到6(周六),周五对应5 $daysToNextFriday = (5 - $today.DayOfWeek + 7) % 7 # 如果今天就是周五,你想从下周五开始的话,就把上面的结果加7 # $daysToNextFriday = ($daysToNextFriday -eq 0) ? 7 : $daysToNextFriday $nextFriday = $today.AddDays($daysToNextFriday) # 用管道输出4个周五 1..4 | ForEach-Object { $datestr = $nextFriday.ToString('dd-MM-yyyy') Write-Output $datestr Write-Output "Friday - $_ - $datestr" $nextFriday = $nextFriday.AddDays(7) }
这段代码里的(5 - $today.DayOfWeek + 7) % 7是为了处理所有情况:比如今天是周六(DayOfWeek=6),计算后得到6天,刚好到下周五;如果今天是周五,结果是0,此时你可以根据需求决定是从今天开始还是下周五开始。
内容的提问来源于stack exchange,提问作者nikita kakraniya
相关产品推荐
相关产品推荐

