为什么脚本块中需要续行?

时间:2016-10-11 15:10:47

标签: powershell

为什么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*')
    )
}

1 个答案:

答案 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脚本块中是有效的。