代码之家  ›  专栏  ›  技术社区  ›  scharette

PowerShell中ForEach对象的语法

  •  2
  • scharette  · 技术社区  · 7 年前

    我有一个有效的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}
    }
    

    在哪里? $Uptime 是一个数组 DateTime 物体。

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

    我试过了,

    $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}' 但是我找不到正确的语法。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Maximilian Burszley    7 年前

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

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

    这相当于你写的。


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

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

    甚至

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