如何将 Powershell 命令的输出用作另一个 Powershell 命令的参数?

ske*_*tax 1 powershell command pipeline parameter-passing command-line-arguments

我想折叠这些 Powershell 命令:

$colour = ""
$colour1 = "Red"
$colour2 = "Green"
if ($var -eq 0) {
    # failure
    $colour = $colour1
} Else {
    # success
    $colour = $colour2
}
Write-Host ("Answer = " + $var) -ForegroundColor $colour
Run Code Online (Sandbox Code Playgroud)

成一行,使用if上面表达式的输出作为 的输入参数Write-Host,例如:

Write-Host ("Answer = " + $var) -ForegroundColor &{if ($var -eq 0) {'Red'} else {'Green'}
Run Code Online (Sandbox Code Playgroud)

我尝试过但失败的事情:

Write-Host ("Answer = " + $var) -ForegroundColor &{if ($var -eq 0) {'Red'} else {'Green'}
Write-Host ("Answer = " + $var) -ForegroundColor `&{if ($var -eq 0) {'Red'} else {'Green'}`
Write-Host ("Answer = " + $var) -ForegroundColor `{if ($var -eq 0) {'Red'} else {'Green'}`
Write-Host ("Answer = " + $var) -ForegroundColor &`{if ($var -eq 0) {'Red'} else {'Green'}`
Write-Host ("Answer = " + $var) -ForegroundColor (&`{if ($var -eq 0) {'Red'} else {'Green'}`)
Write-Host ("Answer = " + $var) -ForegroundColor `{if ($var -eq 0) {return 'Red'} else {return 'Green'}`
Write-Host ("Answer = " + $var) -ForegroundColor `&{if ($var -eq 0) {return 'Red'} else {return 'Green'}`
Write-Host ("Answer = " + $var) -ForegroundColor `&{if ($var -eq 0) {return "Red"} else {return "Green"}`
Write-Host ("Answer = " + $var) -ForegroundColor &{if ($var -eq 0) {return "Red"} else {return "Green"}
Write-Host ("Answer = " + $var) -ForegroundColor &{if ($var -eq 0) {return "Red"} else {return "Green"}}
Write-Host ("Answer = " + $var) -ForegroundColor `&{if ($var -eq 0) {return "Red"} else {return "Green"}}`
Write-Host ("Answer = " + $var) -ForegroundColor &`{if ($var -eq 0) {return "Red"} else {return "Green"}}`
Write-Host ("Answer = " + $var) -ForegroundColor `{if ($var -eq 0) {return "Red"} else {return "Green"}}`
Write-Host ("Answer = " + $var) -ForegroundColor `if ($var -eq 0) {return "Red"} else {return "Green"}`
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 6

要将整个语句(例如if)的输出作为命令参数传递,请将它们括在$(...)子表达式运算符 中

一个简化的例子:

# Note the use of $(...) around the `if` statement.
PS> $var = 0; Write-Host $(if ($var -eq 0) { 'zero' } else { 'nonzero' })
zero
Run Code Online (Sandbox Code Playgroud)

请注意,如果只需要表达式命令的输出,则使用(...),分组运算符就足够了(并且没有副作用)。

例如,PowerShell (Core) 7+ 替代if 语句是三元运算符,其用途是表达式

# PowerShell (Core) 7+ only.
# Since an expression is used, (...) is sufficient.
PS> $var = 0; Write-Host ($var -eq 0 ? 'zero' : 'nonzero')
zero
Run Code Online (Sandbox Code Playgroud)

对于命令(管道),(...)也足够了。

# Since a command is used, (...) is sufficient.
Write-Output (Get-Item *.txt | Where-Object Length -ge 1kb)
Run Code Online (Sandbox Code Playgroud)

有关$(...)vs. 的更多信息(...),请参阅此答案

  • @skeetastax,那是因为您输错了 `-ForegroundColor` (缺少 `e`),因此参数 _name_ 无法识别,因此 `-ForegroundColor` 被视为打印的另一个 _positional_ 参数。换句话说:你的问题是偶然的,这个答案仍然适用。 (2认同)