【问题标题】:PowerShell Get-Date into Switch StatementPowerShell Get-Date 转换为 Switch 语句
【发布时间】:2015-01-30 02:10:05
【问题描述】:

我正在尝试在 PowerShell 中创建一个 SWITCH 语句,以运行基于来自 Get-DateDayOfWeek 的不同代码块,我认为在我通过设置特定日期进行测试之前,它一直在工作,我找到了代码没有按预期工作。

在完美世界中,脚本将在星期一运行。我的目标是以这些格式输出三个变量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 语句为 Get-Date 并在一个范围内输出 7 个日期。周二、周三、周四、周五、周六、周日、周一(下周)

下面是 switch 语句:

#$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

然后,您可以通过在 Get-Date 代理函数中设置它,使脚本中的每个 Get-Date 实例返回您想要的任意日期。

【问题讨论】:

    标签: date powershell switch-statement


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我很想把脚本压缩这么多!我必须道歉,因为我很难解释这些事情。怎么样,本周的星期一我们添加 7,6,5,4,3,2,1 天,给出下周的星期一,然后是本周的星期二,星期三,星期四,星期五,星期六,星期日。如果在星期二运行,则下周仍为星期一,然后添加 0、1、2、3、4、5、6 天。我的问题是计算 Get-Date 数学来解决这个问题。我什至想让用户输入日期为param,然后对其进行数学运算。
    • 如果我今天运行脚本,2015 年 1 月 29 日,我应该得到输出:2/02/2015 1:00 AM 2015-02-02 MONDAY 1/27/2015 1:00上午 2015-01-27 星期二 2015 年 1 月 28 日上午 1:00 2015-01-28 星期三 2015 年 1 月 29 日上午 1:00 2015-01-29 星期四 2015 年 1 月 30 日上午 1:00 2015-01- 30 星期五 2015 年 1 月 31 日上午 1:00 2015 年 1 月 31 日星期六 2015 年 2 月 1 日上午 1:00 2015 年 2 月 1 日星期日
    • 这非常接近,但是我需要具有三种日期格式的三个变量。我正在尝试$d4 = ($p1.DayOfWeek).ToString().ToUpper(),但我得到的只是MONDAY$d4 = ($p1).DayOfWeek.ToString().ToUpper() 也不起作用。
    • 我已经更新了格式字符串。您可以根据需要调整它。
    • 如何在周二或周三运行此句柄?这是我走这条路的唯一原因。谢谢,我设法解决了这个问题:` $d2 = ($p1.AddDays($d).ToString("M/dd/yyyy")) + " 1:00 AM" $d3 = ($p1. AddDays($d).ToString("yyyy/MM/dd")) $d4 = ($p1.AddDays($d).DayOfWeek.ToString().ToUpper())`
    【解决方案2】:

    编辑: 看了你的cmets并戳了一下,我能够将其浓缩为:

    $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
    

    【讨论】:

    • 我从来没有想过这样做@mjolinor,我对此所做的所有研究都没有暗示过。测试现在看起来不错,我将如何将其包装起来,以便在脚本运行时计算出 DayOfWeek,然后输出正确的日期范围。 2/23/2015 1:00 AM 2015-02-23 星期一 2/17/2015 1:00 AM 2015-02-17 星期二 2/18/2015 1:00 AM 2015-02-18 星期三 2/19/2015 1:00 AM 2015-02-19 星期四 2/20/2015 1:00 AM 2015-02-20 星期五 2/21/2015 1:00 AM 2015-02-21 星期六 2/22/2015 1:00 AM -02-22 星期日
    • $var = [DateTime]::Now.DayOfWeek 有什么明显的错误吗,因为那是System.Enum,也许我的《科学怪人》剧本会很好玩?
    • 这只是对测试方法的建议。已经很晚了,我并没有真正剖析剧本。当我编写依赖于日期时间数学的脚本时,我避免使用像 [datetime]::Now 这样的静态日期时间方法,而是使用 Get-Date,因为它可以使用 Get-Date 的代理函数来测试这样的任意日期。
    • 看到cmets后,我添加了一个建议的解决方案来简化脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多