首页 > 解决方案 > Powershell 中 ForEach-Object 的语法

问题描述

我有一个如下所示的有效 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}
}

这显然不是有效的语法(表达式或语句中的意外标记“返回”)。

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

标签: powershellforeachsyntax

解决方案


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

$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

推荐阅读