【问题标题】:ForEach-Object's syntax in powershellPowershell 中 ForEach-Object 的语法
【发布时间】:2018-07-12 15:53:20
【问题描述】:

我有一个如下所示的有效 Powershell 语句,

$Uptime = $Uptime |  ForEach-Object {
    if($_ -eq "N/A"){return $_}else{'{0}:{1}:{2:D2}:{3:D2}' -f ($_.Duration()).Days,($_.Duration()).Hours,($_.Duration()).Minutes,($_.Duration()).Seconds}
}

其中$UptimeDateTime 对象的数组。

我喜欢我的 else 语句的一个衬里,但我想在我的 else 语句中创建一个包含 $_.Duration() 的变量,而不是重复它。

我试过了,

$Uptime = $Uptime |  ForEach-Object {
    if($_ -eq "N/A"){return $_}else{ $d = $_.Duration() return '{0}:{1}:{2:D2}:{3:D2}' -f ($d).Days,($d).Hours,($d).Minutes,($d).Seconds}
}

这显然不是有效的语法(表达式或语句中的意外标记'return')。

显然我的目标是具有与上述相同的行为并返回格式化字符串'{0}:{1}:{2:D2}:{3:D2}',但我找不到正确的语法。

【问题讨论】:

    标签: powershell foreach syntax


    【解决方案1】:

    您可以使用分号在同一行输入多个命令:

    $d = $_.Duration(); return (<expression>) }
    

    您不需要return,因为表达式返回的任何内容都将发送到输出流,该输出流将分配给您的变量$Uptime

    $Uptime = $Uptime |
        ForEach-Object {
            if ($_ -eq "N/A") {
                $_
            } else {
                $d = $_.Duration()
                '{0}:{1}:{2:D2}:{3:D2}' -f $d.Days,$d.Hours,$d.Minutes,$d.Seconds
            }
        }
    

    这相当于你写的。


    您可以进一步缩短格式化字符串(假设$dDateTime 对象):

    '{0:dd}:{0:HH}:{0:mm}:{0:ss}' -f $d
    

    甚至

    $_.Duration() | Get-Date -UFormat %d:%H:%M:%S
    

    【讨论】:

      猜你喜欢
      • 2012-06-20
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多