我们遇到了PowerShell中If / Else结构的问题。我们的脚本在旧版Windows(直到Windows Server 2012 R2)上运行良好,但在新版上无法正常工作。
为了简化事情,让我们从PowerShell帮助文件(Get-Help about_If
)中举一个例子:
if ($a -gt 2)
{
Write-Host "The value $a is greater than 2."
}
else
{
Write-Host "The value $a is less than or equal to 2, is not created or is not initialized."
}
在基于$PSVersionTable.PSVersion为5.1.14409.1018的Windows Server 2012 R2上,结果如预期:
The value is less than or equal to 2, is not created or is not initialized.
然而,像PowerShell 5.1.14393.2879(Windows Server 2016)或5.1.17763.503(Windows Server 2019)这样的较新版本似乎不理解相同的语法:
else : The term 'else' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
请注意,即使是这些较新的PowerShell版本,它们的If / Then示例也完全相同,因此官方上不应该有任何变化。
是的,我知道我可以很容易地将条件重新编写为:
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
} else {
Write-Host "The value $a is less than or equal to 2, is not created or is not initialized."
}
但是我们有很多脚本,如果有一种方式让PowerShell也能理解其他格式,我真的希望避免重复修复和测试所有脚本。这种行为在PowerShell语言规范中是否已经官方记录或者应该被视为错误?
我们目前在基于Web的文档中提供的示例使用另一种格式,但是在更新版本中同样无法工作(出现相同的错误):
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
else {
Write-Host ("The value $a is less than or equal to 2," + " is not created or is not initialized.")
}
我找到了一个页面讨论类似的问题,但它并不完全符合我们的情况。
非常烦人。感谢您提前的帮助。
更新1:如果我将脚本保存为 .ps1 文件并执行该文件,则似乎可以解决问题。我的问题只出现在从编辑器中复制/粘贴代码块(在我的情况下是记事本)。
更新2:
$PSVersionTable
结果:
Name Value
---- -----
PSVersion 5.1.17763.503
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.503
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
将记事本中的条件复制粘贴到PowerShell控制台中,我在新版中遇到了这个错误(在Windows Server 2012 R2中没有出现错误):
if ($a -gt 2)
>> {
>> Write-Host "The value $a is greater than 2."
>> }
PS C:\Scripts> else
else : The term 'else' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ else
+ ~~~~
+ CategoryInfo : ObjectNotFound: (else:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
更新三:和往常一样,细节决定成败。由于在 WS2012R2(及更早版本)中,标准的粘贴键组合 Ctrl+V
不起作用,会出现 ^V
的情况,因此我使用了右键将内容粘贴到控制台中。所以我习惯于通过点击鼠标右键(并在 WS2012R2 上从上下文菜单中选择“粘贴”)将脚本粘贴到控制台中。显然,粘贴功能已经被实现了不同的方式,在右键单击时逐行解释内容,在使用 Ctrl+V
粘贴时则被解释为整个代码块。很好,又学到了新知识。感谢大家的支持和建议!