【问题标题】:Win10 Powershell - Simple If/Elseif Depends on Condition Order?Win10 Powershell - 简单的 If/Elseif 取决于条件顺序?
【发布时间】:2018-07-25 16:49:05
【问题描述】:

我正在尝试编写一个检查操作系统主要版本的部署脚本,然后基于该版本运行命令。我可以用[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 机器上运行良好。

这是我缺少的 Powershell 的错误/怪癖,还是我在做一些愚蠢的事情?

【问题讨论】:

  • 您使用的是分配,而不是比较..

标签: powershell syntax conditional


【解决方案1】:

我想我会写出来,因为我可以比我的评论更好地解释它。当您输入一个表达式而不分配它时,它会输出到管道。在这种情况下

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

【讨论】:

  • 很好地解释了询问者原始代码中实际发生的情况。
【解决方案2】:

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(或阅读链接)。

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 2011-11-01
    • 2021-07-11
    • 2023-04-09
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多