根据此link,按下CANCEL
按钮时读取主机返回的值为$NULL
PS C:\Windows\System32\WindowsPowerShell\v1.0> $a = read-host "please cancel me"
____________________________________________________________________________
PS C:\Windows\System32\WindowsPowerShell\v1.0> if ($A -eq $null) {'null'}
null
我有一个提示用户输入多对密码的功能,如果用户按下CANCEL
,该功能应退出
if (($password -eq $NULL) -or ($confirmpassword -eq $NULL)){
return
}
不幸的是,脚本退出(因为永远不会打印"hello world"
)
function createPwdFiles(){
$stamp = $(get-date -f HH_mm_ss)
$password = Read-Host "Enter password" -AsSecureString
$confirmpassword = Read-Host "Confirm password" -AsSecureString
if (($password -eq $NULL) -or ($confirmpassword -eq $NULL)){
return
}
$pwd1_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
$pwd2_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($confirmpassword))
if($pwd1_text -ne $pwd2_text) {
[System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) | Out-Null
[Windows.Forms.MessageBox]::Show(“Passwords don't match, please try again”, “Passwords don't match”, [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Information) | Out-Null
}
else{
$password | convertfrom-securestring | out-file $pwd_path\$stamp.txt
Add-Content $cred_path\pwd_list.txt $pwd_path\$stamp.txt
}
}
$intAnswer = 6
$a = new-object -comobject wscript.shell
do{
createPwdFiles
$intAnswer = $a.popup("Do you want add another password?", ` 0,"Password",4)
}while ($intAnswer -eq 6)
write-output "hello world"
我有什么遗失的吗?
答案 0 :(得分:2)
$ a不为null,因为$ a成为read-host
的新字符串对象。 Powershell不会让你创建一个空变量,因为$null
为空。要证明这一点,请在控制台中键入Set-Variable $a
。您将返回一个错误,该错误基本上告诉您无法将变量绑定为null。
您的变量实际上是一个空字符串对象。以这种方式测试:
If($a -eq $null){Write-Host "a equals null"}
If($a -eq ""){Write-Host "a is not null";$a|get-member;$a.GetType()}
第二行代码将产生大量输出。特别感兴趣的是:
$a.GetType() | select Name, BaseType
答案 1 :(得分:1)
使用System String类'IsNullOrEmpty静态方法,而不是使用$ null检查。
$a = $null
$b = ""
[String]::IsNullOrEmpty($a)
True
[String]::IsNullOrEmpty($b)
True