按下CANCEL按钮时读取主机返回的值

时间:2014-08-25 17:06:42

标签: function powershell return exit

根据此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"

我有什么遗失的吗?

2 个答案:

答案 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