Win10 Powershell - 简单 If/Elseif 取决于条件顺序?
Win10 Powershell - Simple If/Elseif Depends on Condition Order?
我正在尝试编写一个部署脚本来检查 OS 主要版本,然后基于该版本运行命令。我可以用 [System.Environment]::OSVersion.Version.Major
抓住它,但是当我尝试在 if/elseif 语句中使用它时,我总是得到第一个条件,并且变量以某种方式改变了。
所以我要测试的代码是这样的(使用 Windows 10 机器):
$OS_VERSION=$([System.Environment]::OSVersion.Version.Major)
if ($OS_VERSION = 6) {
Write-Output "OS Version is $OS_VERSION"
# Do stuff...
} elseif ($OS_VERSION = 10) {
Write-Output "OS Version is $OS_VERSION"
# Do different stuff..
}
我注意到,当我切换条件顺序时,它按预期运行,更令人沮丧的是,该语句在 Windows 7 机器上运行得非常好。
这是我缺少的 bug/quirk 的 Powershell,还是我在做一些愚蠢的事情?
PowerShell 不使用 =
作为比较运算符。
如果要比较是否相等,运算符为-eq
:
if ($OS_VERSION -eq 6) {
Write-Output "OS Version is $OS_VERSION"
# Do stuff...
} elseif ($OS_VERSION -eq 10) {
Write-Output "OS Version is $OS_VERSION"
# Do different stuff..
}
这将解决您的问题。您应该仔细查看 Get-Help -Name about_Comparison_Operators
(或阅读 link)。
我想我应该把它写出来,因为我可以比我的评论更好地解释它。当您输入一个表达式而不分配它时,它会输出到管道。在这种情况下
if ($OS_VERSION = 6) {
是一个表达式(因为 if
语句计算表达式的布尔值以采取行动)。如果在交互式提示下输入时将其括在括号中,它将在分配变量的同时输出变量分配的内容,很像
6 | Tee-Object -Variable OS_VERSION
会,或者 -PassThru
开启某些 cmdlet:
> ($Test = 6)
>> 6
> $Test
>> 6
所以你在这里做的是 总是 将该变量分配给 6
计算结果为 true
因为 if
是真实的并且非零是 true
。您需要的是 -eq
比较运算符 :
if ($OS_VERSION -eq 6) {
可以通过以下命令找到更多信息:
Get-Help -Name about_Comparison_Operators
我正在尝试编写一个部署脚本来检查 OS 主要版本,然后基于该版本运行命令。我可以用 [System.Environment]::OSVersion.Version.Major
抓住它,但是当我尝试在 if/elseif 语句中使用它时,我总是得到第一个条件,并且变量以某种方式改变了。
所以我要测试的代码是这样的(使用 Windows 10 机器):
$OS_VERSION=$([System.Environment]::OSVersion.Version.Major)
if ($OS_VERSION = 6) {
Write-Output "OS Version is $OS_VERSION"
# Do stuff...
} elseif ($OS_VERSION = 10) {
Write-Output "OS Version is $OS_VERSION"
# Do different stuff..
}
我注意到,当我切换条件顺序时,它按预期运行,更令人沮丧的是,该语句在 Windows 7 机器上运行得非常好。
这是我缺少的 bug/quirk 的 Powershell,还是我在做一些愚蠢的事情?
PowerShell 不使用 =
作为比较运算符。
如果要比较是否相等,运算符为-eq
:
if ($OS_VERSION -eq 6) {
Write-Output "OS Version is $OS_VERSION"
# Do stuff...
} elseif ($OS_VERSION -eq 10) {
Write-Output "OS Version is $OS_VERSION"
# Do different stuff..
}
这将解决您的问题。您应该仔细查看 Get-Help -Name about_Comparison_Operators
(或阅读 link)。
我想我应该把它写出来,因为我可以比我的评论更好地解释它。当您输入一个表达式而不分配它时,它会输出到管道。在这种情况下
if ($OS_VERSION = 6) {
是一个表达式(因为 if
语句计算表达式的布尔值以采取行动)。如果在交互式提示下输入时将其括在括号中,它将在分配变量的同时输出变量分配的内容,很像
6 | Tee-Object -Variable OS_VERSION
会,或者 -PassThru
开启某些 cmdlet:
> ($Test = 6)
>> 6
> $Test
>> 6
所以你在这里做的是 总是 将该变量分配给 6
计算结果为 true
因为 if
是真实的并且非零是 true
。您需要的是 -eq
比较运算符 :
if ($OS_VERSION -eq 6) {
可以通过以下命令找到更多信息:
Get-Help -Name about_Comparison_Operators