我正在尝试获取有关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"
}