【问题标题】:PowerShell New-TimeSpan Displayed Friendly with Day(s) Hour(s) Minute(s) Second(s)PowerShell New-TimeSpan 以天(s)小时(s)分钟(s)秒显示友好
【发布时间】:2020-04-25 20:10:20
【问题描述】:

我一直在寻找类似于.NET examples 中的示例的 PowerShell 脚本。取一个 New-TimeSpan 并显示为 1 天 2 小时 3 分钟 4 秒。排除它的零,在需要的地方添加复数“s”。有谁有这个方便吗?

据我所知:

$StartDate = (Get-Date).ToString("M/dd/yyyy h:mm:ss tt")

Write-Host "Start Time: $StartDate"

# Do Something

$EndDate = (Get-Date).ToString("M/dd/yyyy h:mm:ss tt")

Write-Host "End Time: $EndDate" -ForegroundColor Cyan

$Duration = New-TimeSpan -Start $StartDate -End $EndDate
$d = $Duration.Days; $h = $Duration.Hours; $m = $Duration.Minutes; $s = $Duration.Seconds

Write-Host "Duration: $d Days, $h Hours, $m Minutes, $s Seconds"

【问题讨论】:

    标签: powershell formatting timespan


    【解决方案1】:

    为什么不直接这样做:

    $StartDate = (Get-Date).AddDays(-1).AddMinutes(-15).AddSeconds(-3)
    $EndDate = Get-Date
    
    $Duration = New-TimeSpan -Start $StartDate -End $EndDate
    
    $Day = switch ($Duration.Days) {
        0 { $null; break }
        1 { "{0} Day," -f $Duration.Days; break }
        Default {"{0} Days," -f $Duration.Days}
    }
    
    $Hour = switch ($Duration.Hours) {
        #0 { $null; break }
        1 { "{0} Hour," -f $Duration.Hours; break }
        Default { "{0} Hours," -f $Duration.Hours }
    }
    
    $Minute = switch ($Duration.Minutes) {
        #0 { $null; break }
        1 { "{0} Minute," -f $Duration.Minutes; break }
        Default { "{0} Minutes," -f $Duration.Minutes }
    }
    
    $Second = switch ($Duration.Seconds) {
        #0 { $null; break }
        1 { "{0} Second" -f $Duration.Seconds; break }
        Default { "{0} Seconds" -f $Duration.Seconds }
    }
    
    "Duration: $Day $Hour $Minute $Second"
    

    输出将是:

    Duration: 1 Day, 0 Hours, 15 Minutes, 3 Seconds
    

    持续时间的每个部分都有 2 个 ...

    $StartDate = (Get-Date).AddDays(-2).AddHours(-2).AddMinutes(-2).AddSeconds(-2)
    

    结果是这样的:

    Duration: 2 Days, 2 Hours, 2 Minutes, 2 Seconds
    

    当然,如果你不止一次需要它,你应该把它包装在一个函数中。 ;-)
    当然,您可以根据需要添加更复杂的条件。

    【讨论】:

    • 我喜欢这种方法。如果天数、小时数和分钟数为零,我将如何做到这一点?例如:持续时间:2 小时、30 分钟、10 秒或持续时间:30 分钟、10 秒或持续时间:10 秒。
    • 你刚刚改变了你的问题! ;-) ...但答案是一样的。如果值为 0,则检查从几天到几分钟,并相应地格式化输出。例如,当您有“15 小时 235 毫秒”时,它可能看起来很奇怪。分钟和秒在哪里?是失败吗? ;-)
    • 我想我没有恰当地用词,但我确实说“排除它的零”。我同意如果中间时间增量恰好落在 0 小时 0 分钟,那看起来会很奇怪,所以我想保留这些,我不关心这个脚本的毫秒数。我是 PowerShell 的新手,那么我将如何更新您的示例以在它们为 0 时将领先的 0 天、0 小时和 0 分钟取出?
    • 嗯...哎呀...我实际上完全错过了。 ;-) ...但与其抱怨,不如自己开始尝试。经验伴随着实践而来。 ;-) ...我更改了代码。我注释掉了忽略零值的情况。有或没有都试一下。
    • 非常感谢您的帮助,它运行良好,我在此过程中学到了一些东西 :) 很抱歉对最初的问题感到困惑。
    【解决方案2】:

    表格视图还不错:

    new-timespan -Days 1 -Hours 1 -Minutes 1 -Seconds 1 | ft
    
    Days Hours Minutes Seconds Milliseconds
    ---- ----- ------- ------- ------------
    1    1     1       1       0
    

    【讨论】:

      猜你喜欢
      • 2014-11-02
      • 2016-11-20
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多