为什么PowerShell在Where-Object
scriptblock的第一个条件之后需要一个行继续反引号?应该清楚的是,由于没有结束大括号}
,脚本块尚未结束。
为什么这样做:
Get-Process | Where-Object {
($_.Responding -ne $true) `
-or ($_.ProcessName -like 'W*')
}
并且没有:
Get-Process | Where-Object {
($_.Responding -ne $true)
-or ($_.ProcessName -like 'W*')
}
这也失败了。
Get-Process | Where-Object {
(
($_.Responding -ne $true)
-or ($_.ProcessName -like 'W*')
)
}
答案 0 :(得分:2)
您的第一个示例有效,因为您告诉PowerShell该语句将在下一行中继续(通过转义换行符)。
另外两个例子失败了,因为第一行上的表达式本身就是一个完整的表达式,而第二行上的表达式则不然。 PowerShell首先评估($_.Responding -ne $true)
,然后尝试评估-or ($_.ProcessName -like 'W*')
,这是一个无效的语句,因此失败。
为避免这种情况,您需要向解释器明确说明第一行的语句将在下一行继续。这可以通过像第一个例子中那样转义换行符来完成:
Get-Process | Where-Object {
($_.Responding -ne $true) `
-or ($_.ProcessName -like 'W*')
}
或通过以允许解释器检测到还有更多内容的方式构建语句,例如:将操作符放在第一行的末尾而不是第二行的开头:
Get-Process | Where-Object {
($_.Responding -ne $true) -or
($_.ProcessName -like 'W*')
}
花括号不能用于检测语句的结尾,因为将多个语句放在Where-Object
脚本块中是有效的。