无法将变量的值与 Powershell 中的字符串进行比较

Can not compare Values of Variable with strings in Powershell

我正在尝试获取有关 iSCSI 目标连接状态的信息。

理想情况下,我希望有一个变量,其值为 True 或 False 以表示已连接或未连接,这样我就可以 运行 命令根据需要连接或断开连接。

如果我直接设置变量,它工作正常。使用 cmdlet 的输出设置变量似乎可行,但将值 False 或 True 与 IF 进行比较总是会得到 True。对我来说,问题是:直接将变量设置为 True 和使用 cmdlet 的输出之间的区别在哪里...?

示例一:

$IsConnected=true

if($IsConnected -eq 'true') {
    echo IsConnected!
} else {
    echo IsNotConnected
}

如预期的结果:IsConnected

样本二:

$IsConnected=False
if($IsConnected -eq 'true') {
    echo IsConnected!
} else {
    echo IsNotConnected
}

结果如预期,在:IsNotConnected

所以现在我的知识结束了...:

示例三:

PS ~> $IsConnected=get-iscsitarget | select -ExpandProperty IsConnected
PS ~> echo $IsConnected
True
PS ~> if($IsConnected -eq 'True') {Echo "IsConnected"}else{echo "IsNotConnected"}
IsConnected
PS ~> if($IsConnected -eq 'False') {Echo "IsConnected"}else{echo "IsNotConnected"}
IsConnected
PS ~> if($IsConnected -eq '17beerarenotenaugh') {Echo "IsConnected"}else{echo "IsNotConnected"}
IsConnected

PowerShell 的比较运算符 重载 ,这意味着它们可能会根据您提供的 操作数 的类型具有不同的行为。

行为完全取决于您提供的左侧 (lhs) 操作数的类型,PowerShell 将尝试转换右侧 (rhs) 相同。

在您的示例中,$IsConnected 变量的值是 [bool] - 因此 PowerShell 尝试将 rhs 操作数转换为 [bool] 到。

[string][bool]的转换逻辑是:

  • 空字符串 = $false
  • 非空字符串=$true

由于'True''False''17beerarenotenaugh'都是所有非空,所以if条件基本解释为:

if($IsConnected -eq $true) { ... }
if($IsConnected -eq $true) { ... }
if($IsConnected -eq $true) { ... }

使用自动变量 $true$false 来避免这种情况:

PS ~> if($IsConnected -eq $false) {Echo "IsConnected"}else{echo "IsNotConnected"}
IsNotConnected

或者,使用 -not 运算符:

PS ~> if(-not $IsConnected) {Echo "IsConnected"}else{echo "IsNotConnected"}
IsNotConnected

感谢您的帮助!。我们的 NAS 有时会断开连接,或者只是在重启后不连接,所以也许其他人会觉得这很有用...:[=​​11=]

$IsConnected = Get-IscsiTarget | Select-Object -ExpandProperty IsConnected
If($IsConnected -eq $false)
{
    Get-IscsiTarget | Where-Object -Property NodeAddress -Like "iqn.2000-01.com.synology:nas01.Target-myiqnnumber" |
    Connect-IscsiTarget -AuthenticationType ONEWAYCHAP -ChapUsername mychapuser -ChapSecret mychapuserssecret
}
else
{
    echo "IsConnected=$Isconnected iSCSI-Drive:OK"
}