无法将变量的值与 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"
}
我正在尝试获取有关 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"
}