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

3
我想要折叠这些PowerShell命令:
$colour = ""
$colour1 = "Red"
$colour2 = "Green"
if ($var -eq 0) {
    # failure
    $colour = $colour1
} Else {
    # success
    $colour = $colour2
}
Write-Host ("Answer = " + $var) -ForegroundColor $colour

将上面的if表达式的输出作为Write-Host的输入参数,合并成一行,类似于:
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) {'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"}`
1个回答

7
要将整个语句(如if)的输出作为命令参数传递,请使用$(...),即子表达式运算符
一个简化的例子:
# Note the use of $(...) around the `if` statement.
PS> $var = 0; Write-Host $(if ($var -eq 0) { 'zero' } else { 'nonzero' })
zero

请注意,如果只需要表达式或命令的输出,则使用分组运算符(...)即可(并且无副作用)。
例如,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

对于命令(管道),(...) 也是足够的。
# Since a command is used, (...) is sufficient.
Write-Output (Get-Item *.txt | Where-Object Length -ge 1kb)

有关$(...)(...)的更多信息,请参见this answer


2
@skeetastax,这是因为您输错了-ForegroundColor(缺少e),所以参数名称无法识别,-ForgroundColor被视为另一个位置参数来打印。换句话说:您的问题是偶然的,而这个答案仍然适用。 - undefined
@skeetastax :) 犯这种错误很容易。很高兴听到它起作用了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接