刚接触 PS,我想在每个月的第一个和第二个星期二之间的星期日批处理文件。 我知道如何找到我要查找的第 1 个和第 2 个星期二,其他的我不知道。
$FindNthDay = 1
$WeekDay = 'Tuesday'
[datetime]$Today = [datetime]::NOW
$todayM = $Today.Month.ToString()
$todayY = $Today.Year.ToString()
[datetime]$StrtMonth1 = $todayM + '/1/' + $todayY
while ($StrtMonth1.DayofWeek -ine $WeekDay ) { $StrtMonth1 = $StrtMonth1.AddDays(1) }
$StrtMonth1.AddDays(7 * ($FindNthDay - 1))
#
$FindNthDay = 2
$WeekDay = 'Tuesday'
[datetime]$Today = [datetime]::NOW
$todayM = $Today.Month.ToString()
$todayY = $Today.Year.ToString()
[datetime]$StrtMonth = $todayM + '/1/' + $todayY
while ($StrtMonth.DayofWeek -ine $WeekDay ) { $StrtMonth = $StrtMonth.AddDays(1) }
$StrtMonth.AddDays(7 * ($FindNthDay - 1))
答案 0 :(得分:0)
我知道如何找到第一个和第二个星期二
因为中间只有一个星期天,所以你只需要找到第一个:
# Get-Date -Day 1 will give us the 1st of the current month
$firstTuesday = Get-Date -Day 1
while($firstTuesday.DayOfWeek -ne 'Tuesday') {
$firstTuesday = $firstTuesday.AddDays(1)
}
然后再增加 5 天:
$sundayAfterFirstTuesday = $firstTuesday.AddDays(5).Date
其中(2021 年 1 月)给了我们:
PS ~> $sundayAfterFirstTuesday
Sunday, January 10, 2021 12:00:00 AM
答案 1 :(得分:0)
除了 Mathias's fine answer 之外,我还挂断了这个。鉴于 .DayOfWeek
是一个很容易转换为 [enum]
的 [Int]
,我一直在寻找一种数学上简洁的方法来推导出第一个星期二。因为很明显如何通过执行 .AddDays(5)
来找到下一个星期日。
老实说,我有点磕磕绊绊,因为虽然 .DayOfWeek
是 0 - 6,但要添加多少天取决于当前日期,在这种情况下是一个月的第一天,是小于还是大于星期二( 2)。值得一玩;这是我想出的两种替代方法:
示例 1:一个根本不简洁但非常易读的 switch 语句:
$Day1 = Get-Date "1/1/2021"
Switch ( $Day1.DayOfWeek )
{
'Sunday' { $Sunday = $Day1.Adddays(2).AddDays( 5 ); Break }
'Monday' { $Sunday = $Day1.Adddays(1).AddDays( 5 ); Break }
'Tuesday' { $Sunday = $Day1.AddDays( 5 ); Break }
'Wednesday' { $Sunday = $Day1.Adddays(6).AddDays( 5 ); Break }
'Thursday' { $Sunday = $Day1.Adddays(5).AddDays( 5 ); Break }
'Friday' { $Sunday = $Day1.Adddays(4).AddDays( 5 ); Break }
'Saturday' { $Sunday = $Day1.Adddays(3).AddDays( 5 ); Break }
}
$Sunday
这也很容易调整。例如,如果您想在第一个和第二个星期一等之间切换到第一个星期日...
对于数学/逻辑方法,结果有点粗糙:
$Day1 = Get-Date "1/1/2021"
If( [Int]$Day1.DayOfWeek -gt 2 ) { $Interval = 7 - ([Int]$Day1.DayOfWeek - 2) }
Else { $Interval = 2 - [Int]$Day1.DayOfWeek }
$Sunday = $Day1.AddDays( $Interval ).AddDays( 5 )
$Sunday
上面的例子可以在 PowerShell 7+ 中使用三元运算符更简洁:
$Day1 = Get-Date "1/1/2021"
$Interval = $Day1.DayOfWeek -gt 2 ? 7 - ([Int]$Day1.DayOfWeek - 2) : 2 - [Int]$Day1.DayOfWeek
$Sunday = $Day1.AddDays( $Interval ).AddDays( 5 )
$Sunday
注意:所有示例都以 2021 年 1 月 1 日作为开始日期,但我在一个月的多个第一天进行了测试,例如,如果第一天是星期一、星期日、星期四等...
注意:如果小心 PowerShell 类型转换系统,一些 [Int]
转换可能会被删除,但我想把它放在那里。如果我有时间,我会进一步清理。
答案 2 :(得分:0)
或者稍微不同的方法:
$BaseDate = (Get-Date 3/1/2021)
$BaseDate.AddDays( (& {if ([int]$BaseDate.DayOfWeek -gt 2) {14}
else { 7 } }) - [int]($BaseDate).DayOfWeek)
2021 年 3 月 7 日,星期日,上午 12:00:00