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



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

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

如果我直接设置变量,它运行良好。使用cmdlet的输出设置变量似乎有效,但将值False或True与IF进行比较总是会得到True。对我来说,问题是:直接将Variable设置为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有时会断开连接,或者只是在重新启动后没有连接,所以其他人可能会觉得这很有用…:

$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"
}

最新更新