Date PowerShell在开关语句中获取日期

Date PowerShell在开关语句中获取日期,date,powershell,switch-statement,Date,Powershell,Switch Statement,我试图在PowerShell中创建一个SWITCH语句,根据DayOfWeekfromGet Date运行不同的代码块,我认为它可以工作,直到通过设置特定日期进行测试,我发现代码没有按预期工作 在完美的世界里,脚本将在周一运行。我的目标是以这些格式输出三个变量2/02/2015 1:00 AM 2015-02-02 MONDAY基本上从周一到下周周一增加一天 问题来自于我试图预测脚本将在周一以外的另一天运行。因此,我想使用(Get Date).AddDays($I)来输出正确的日期,但当我尝试在

我试图在PowerShell中创建一个
SWITCH
语句,根据
DayOfWeek
from
Get Date
运行不同的代码块,我认为它可以工作,直到通过设置特定日期进行测试,我发现代码没有按预期工作

在完美的世界里,脚本将在周一运行。我的目标是以这些格式输出三个变量
2/02/2015 1:00 AM 2015-02-02 MONDAY
基本上从周一到下周周一增加一天

问题来自于我试图预测脚本将在周一以外的另一天运行。因此,我想使用
(Get Date).AddDays($I)
来输出正确的日期,但当我尝试在将来使用Get Date设置日期时,返回的日期不正确

当我开始使用
$var=(get date-Year 2015-Month 02-Day 04)进行测试时。DayOfWeek
要设置特定日期,switch语句没有输出正确的日期

总之,PowerShell Switch语句可获取日期并输出范围内的7个日期。周二、周三、周四、周五、周六、周日、周一(下周)

下面是switch语句:

#$var=(获取日期).DayOfWeek
$var=[DayOfWeek]::星期日
#$var=(获取日期-2015年-第2个月-第4天)。DayOfWeek
交换机($var){
([星期一]“星期一”){
对于($i=1;$i-le7;$i++){
$d=((获取日期).AddDays($i))
$d2=($d.ToString(“M/dd/yyyy”)+“凌晨1:00”)
$d3=($d.ToString(“yyyy-MM-dd”))
$d4=(($d).DayOfWeek.ToString().ToUpper())
“$d2$d3$d4”}结束
}#完星期一
([星期二]“星期二”){
$i=5,-1,0,1,2,3,4
foreach($i中的日){
$d=((获取日期).AddDays($day))
$d2=($d.ToString(“M/dd/yyyy”)+“凌晨1:00”)
$d3=($d.ToString(“yyyy-MM-dd”))
$d4=(($d).DayOfWeek.ToString().ToUpper())
“$d2$d3$d4”}结束
}#完星期二
([星期三]){
$i=5,-1,0,1,2,3,4
foreach($i中的日){
$d=((获取日期).AddDays($day))
$d2=($d.ToString(“M/dd/yyyy”)+“凌晨1:00”)
$d3=($d.ToString(“yyyy-MM-dd”))
$d4=(($d).DayOfWeek.ToString().ToUpper())
“$d2$d3$d4”}结束
}#完周三
([星期四]){
$i=4,-1,0,1,2,3,4
foreach($i中的日){
$d=((获取日期).AddDays($day))
$d2=($d.ToString(“M/dd/yyyy”)+“凌晨1:00”)
$d3=($d.ToString(“yyyy-MM-dd”))
$d4=(($d).DayOfWeek.ToString().ToUpper())
“$d2$d3$d4”}结束
}#完周四
([星期五]“星期五”){
$i=5,-1,0,1,2,3,4
foreach($i中的日){
$d=((获取日期).AddDays($day))
$d2=($d.ToString(“M/dd/yyyy”)+“凌晨1:00”)
$d3=($d.ToString(“yyyy-MM-dd”))
$d4=(($d).DayOfWeek.ToString().ToUpper())
“$d2$d3$d4”}结束
}#完周五
([DayOfWeek]“周六”){
$i=5,-1,0,1,2,3,4
foreach($i中的日){
$d=((获取日期).AddDays($day))
$d2=($d.ToString(“M/dd/yyyy”)+“凌晨1:00”)
$d3=($d.ToString(“yyyy-MM-dd”))
$d4=(($d).DayOfWeek.ToString().ToUpper())
“$d2$d3$d4”}结束
}#完周六
([星期日]“星期日”){
$i=1,-1,0,1,2,3,4
foreach($i中的日){
$d=((获取日期).AddDays($day))
$d2=($d.ToString(“M/dd/yyyy”)+“凌晨1:00”)
$d3=($d.ToString(“yyyy-MM-dd”))
$d4=(($d).DayOfWeek.ToString().ToUpper())
“$d2$d3$d4”}结束
}#周日结束
}#终端开关
然后,您可以通过在
Get Date
代理函数中设置脚本中的每个
Get Date
实例,使其返回所需的任意日期。

编辑: 在看了你的评论并稍微戳了戳之后,我能够将其浓缩为:

$LastMonday = 
(Get-Date).adddays(-(1..7)[[int](Get-Date).DayOfWeek -2])

 ,7+(1..6)| foreach {
   $d = ($LastMonday.AddDays($_))
   $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
   $d3 = ($d.ToString("yyyy-MM-dd"))
   $d4 = (($d).DayOfWeek).ToString().ToUpper()
   "$d2 $d3 $d4"}

2/02/2015 1:00 AM 2015-02-02 MONDAY
1/27/2015 1:00 AM 2015-01-27 TUESDAY
1/28/2015 1:00 AM 2015-01-28 WEDNESDAY
1/29/2015 1:00 AM 2015-01-29 THURSDAY
1/30/2015 1:00 AM 2015-01-30 FRIDAY
1/31/2015 1:00 AM 2015-01-31 SATURDAY
2/01/2015 1:00 AM 2015-02-01 SUNDAY
我认为问题可能在于你的测试方法

我测试从Get date开始计算日期时间的脚本,如下所示:

function get-date {[datetime]'02/04/2015'}

$var = (get-date).DayOfWeek
#$var = [DayOfWeek]::Sunday
#$var = (get-date -Year 2015 -Month 02 -Day 04).DayOfWeek
Switch ($var){
([DayOfWeek] 'Monday'){
for ($i = 1; $i -le 7; $i++){
 $d = ((Get-Date).AddDays($i))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Monday
([DayOfWeek] 'Tuesday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Tuesday
([DayOfWeek] 'Wednesday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Wednesday
([DayOfWeek] 'Thursday'){
$i= 4,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Thursday
([DayOfWeek] 'Friday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Friday
([DayOfWeek] 'Saturday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Saturday
([DayOfWeek] 'Sunday'){
$i= 1,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Sunday
}#End Switch
编辑: 在看了你的评论并稍微戳了戳之后,我能够将其浓缩为:

$LastMonday = 
(Get-Date).adddays(-(1..7)[[int](Get-Date).DayOfWeek -2])

 ,7+(1..6)| foreach {
   $d = ($LastMonday.AddDays($_))
   $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
   $d3 = ($d.ToString("yyyy-MM-dd"))
   $d4 = (($d).DayOfWeek).ToString().ToUpper()
   "$d2 $d3 $d4"}

2/02/2015 1:00 AM 2015-02-02 MONDAY
1/27/2015 1:00 AM 2015-01-27 TUESDAY
1/28/2015 1:00 AM 2015-01-28 WEDNESDAY
1/29/2015 1:00 AM 2015-01-29 THURSDAY
1/30/2015 1:00 AM 2015-01-30 FRIDAY
1/31/2015 1:00 AM 2015-01-31 SATURDAY
2/01/2015 1:00 AM 2015-02-01 SUNDAY
我认为问题可能在于你的测试方法

我测试从Get date开始计算日期时间的脚本,如下所示:

function get-date {[datetime]'02/04/2015'}

$var = (get-date).DayOfWeek
#$var = [DayOfWeek]::Sunday
#$var = (get-date -Year 2015 -Month 02 -Day 04).DayOfWeek
Switch ($var){
([DayOfWeek] 'Monday'){
for ($i = 1; $i -le 7; $i++){
 $d = ((Get-Date).AddDays($i))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Monday
([DayOfWeek] 'Tuesday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Tuesday
([DayOfWeek] 'Wednesday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Wednesday
([DayOfWeek] 'Thursday'){
$i= 4,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Thursday
([DayOfWeek] 'Friday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Friday
([DayOfWeek] 'Saturday'){
$i= 5,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Saturday
([DayOfWeek] 'Sunday'){
$i= 1,-1,0,1,2,3,4
foreach ($day in $i){
 $d = ((Get-Date).AddDays($day))
 $d2 = ($d.ToString("M/dd/yyyy") + " 1:00 AM")
 $d3 = ($d.ToString("yyyy-MM-dd"))
 $d4 = (($d).DayOfWeek).ToString().ToUpper()
"$d2 $d3 $d4"}#End For
}#End Sunday
}#End Switch

这可能会有帮助。没有开关,只有数学。您可以将格式字符串更改为任何您喜欢的格式。只需更改“yyyy-MM-dd-dd HH:MM-tt”。请参阅,以了解有关完全按照需要获取输出的详细信息

function get-nextweek ([System.DateTime]$p1)
{
    #Set the time to 01:00
    $p1 = [DateTime]($p1.Date + "01:00")
    # + 1 week + 2 days (Tuesday) - Current day of week (0 based) % 7 + 0..6
    0..6 | %{
             #get number of days till Monday
             $d = (8-$p1.DayOfWeek)%7+$_
             #Add 7 if today is Monday to get next week
             if($d -eq 0){$d=7}
             #Output the days as a custom string
             $out = $p1.AddDays($d)
             "$($out.ToString('MM/dd/yyyy HH:mm tt yyyy-MM-dd')) $($out.DayOfWeek.ToString().ToUpper())"
    }
}
输出:

C:\ > get-nextweek '01-29-2015'
02/02/2015 01:00 AM 2015-02-02 MONDAY
02/03/2015 01:00 AM 2015-02-03 TUESDAY
02/04/2015 01:00 AM 2015-02-04 WEDNESDAY
02/05/2015 01:00 AM 2015-02-05 THURSDAY
02/06/2015 01:00 AM 2015-02-06 FRIDAY
02/07/2015 01:00 AM 2015-02-07 SATURDAY
02/08/2015 01:00 AM 2015-02-08 SUNDAY

这可能会有帮助。没有开关,只有数学。您可以将格式字符串更改为任何您喜欢的格式。只需更改“yyyy-MM-dd-dd HH:MM-tt”。请参阅,以了解有关完全按照需要获取输出的详细信息

function get-nextweek ([System.DateTime]$p1)
{
    #Set the time to 01:00
    $p1 = [DateTime]($p1.Date + "01:00")
    # + 1 week + 2 days (Tuesday) - Current day of week (0 based) % 7 + 0..6
    0..6 | %{
             #get number of days till Monday
             $d = (8-$p1.DayOfWeek)%7+$_
             #Add 7 if today is Monday to get next week
             if($d -eq 0){$d=7}
             #Output the days as a custom string
             $out = $p1.AddDays($d)
             "$($out.ToString('MM/dd/yyyy HH:mm tt yyyy-MM-dd')) $($out.DayOfWeek.ToString().ToUpper())"
    }
}
输出:

C:\ > get-nextweek '01-29-2015'
02/02/2015 01:00 AM 2015-02-02 MONDAY
02/03/2015 01:00 AM 2015-02-03 TUESDAY
02/04/2015 01:00 AM 2015-02-04 WEDNESDAY
02/05/2015 01:00 AM 2015-02-05 THURSDAY
02/06/2015 01:00 AM 2015-02-06 FRIDAY
02/07/2015 01:00 AM 2015-02-07 SATURDAY
02/08/2015 01:00 AM 2015-02-08 SUNDAY

我从来没有想过要这样做@mjolinor,我对这方面所做的所有研究都没有暗示过这一点。测试现在看起来不错,我该如何包装它,以便在脚本运行时计算出DayOfWeek,然后输出正确的日期范围。2015年2月23日1:00 AM 2015-02-23星期一2015年2月17日1:00 AM 2015-02-17星期二2015年2月18日1:00 AM 2015-02-18星期三2015年2月19日1:00 AM 2015-02-19星期四2015年2月20日1:00 AM 2015-02-20星期五2015年2月21日1:00 AM 2015-02-21星期六2015年2月22日1:00 AM 2015-02-22星期日有什么明显的错误吗
$var=[DateTime]::现在是.DayOfWeek
,因为那是
System.Enum
,可能会很好地处理我的弗兰肯斯坦脚本?这只是对测试方法的一个建议。很晚了,我没有仔细分析剧本。当我编写依赖datetime数学的脚本时,我避免使用静态datetime方法,如[datetime]::现在支持Get Date,因为它可以使用Get Date的代理函数测试这样的任意日期。查看注释后,我添加了一个建议的解决方案来简化脚本。我从来没有想到@mjolinor会这么做,我对这方面所做的所有研究都从未暗示过这一点。测试现在看起来不错,我该如何包装它,以便在脚本运行时计算出DayOfWeek,然后输出正确的日期范围。2015年2月23日1:00 AM 2015-02-23星期一2015年2月17日1:00 AM 2015-02-17星期二2015年2月18日1:00 AM 2015-02-18星期三2015年2月19日1:00 AM 2015-02-19星期四2015年2月20日1:00 AM 2015-02-20星期五2015年2月21日1:00 AM 2015-02-21星期六2015年2月22日1:00 AM 2015-02-22星期日有什么明显的错误吗