我在使用 PS 时遇到了一些问题,我不知道是我做错了什么,还是只是 PS 中的一个错误(而且我找不到任何答案)?我使用不同的 Windows 操作系统对 PS v4、v5.0 和 v5.1 进行了测试。首先,似乎无论操作系统是什么,无论 PS 版本是什么,当我直接通过 PS 窗口或通过 PS 脚本运行以下代码片段时,我都不会收到任何错误,一切似乎都正常:
$error.clear()
If ($error -ne $null) { $error }
但是,在特定类型的系统上(似乎是基于操作系统的问题),我运行以下代码,有时会收到错误:
$error.clear()
If ($error -ne $null)
{
$error
}
我可以在 Windows 10 和 Windows 2016 服务器上运行上述错误生成代码,一切正常(没有报告任何错误)。如果我在 Windows 2008 R2 或 Windows 2012 R2 上运行完全相同的代码,我会收到以下错误消息:
Missing statement block after If ( condition ).
无论我在 Windows 2008 R2 和 Windows 2012 R2 系统上安装了 PS 4、5 还是 5.1.1,我都会收到错误。无论我是否以管理员身份运行,结果都一样。无论它们是加入域的系统还是工作组系统,似乎都没有区别。截至 2017 年 5 月星期二的补丁更新,我们所有的系统都已打上补丁。
PS 是否要求(在 Windows 2008 R2 和 Windows 2012 R2 系统上)PS“IF”语句的左花括号必须与 IF 语句本身位于同一行?对于 Windows 10 和 Windows 2016 服务器,似乎并非如此。
提前致谢,
地下水气开采
答案1
当 PowerShell 收到一行(或一个代码块)代码时,它会将该块(或一行)作为整体进行评估
在这种情况下,第一行是:If ($error -ne $null)
PowerShell 知道如何解释该行,但其语法无效,因为 PowerShell 在满足条件的情况下没有“要做什么”块。
如果你将整个块提供给 PowerShell - 它会识别“要执行的操作块”并知道下一步需要去哪里:
您能否详细说明您发现哪些系统和平台接受单行?我刚刚在 Win10(PowerShell 5)、2012R2(Powershell 4 和 5)、Windows 7(PowerShell 4 和 5)上进行了测试,它们的行为完全相同。
答案2
当我的语句块包含此处字符串时,我遇到了同样的问题
If ($error -ne $null)
{
$query = @"
do some sql;
do more sql;
"@
}
当我将其更改为没有此处字符串的一行时,它起作用了
If ($error -ne $null)
{
$query = "do some sql;do more sql;"
}
您的语句块中可能有一些内容,而 powershell 也不允许将其作为多行。
答案3
Powershell 有两种解析命令的方式,表达式模式和参数模式。(见https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parsing?view=powershell-7.1)
在没有测试不同操作系统的情况下,我最好的猜测是这些命令在你的操作系统之间从表达式模式更改为参数模式(或反之亦然,取决于你采用哪种方式)。
最简单的解决方法(最佳实践)是始终将左花括号留在顶行。这样,无论解析器使用哪种模式,命令/脚本都可以正常工作。
您还可以通过在行尾添加反引号 ` 来强制行继续。不过这些很难看到,并且可能会引发其他问题,因此您的里程可能会有所不同。