Powershell中奇怪的无法停止的Do-While循环

时间:2015-02-06 15:48:41

标签: powershell

我有一个奇怪的问题。 想要创建一个脚本,输入用户插入一个字符串,然后再在输入请求中循环,直到留空。

脚本在PowerGUI中运行良好,继续提示输入请求,直到我只按[Enter]而不是脚本继续。 当我尝试在powershell shell上使用脚本时出现问题。 仅按[Enter]让DoWhile循环继续提示输入请求,除非CTRL-Z,否则无法停止输入请求。

为什么会有一些想法?

[Int] $num = 1
[Array] $conts = @()

do {
    $a = read-host "Indirizzo mail Contatto $num`?"
    if ($a -ne $null) {
            $num++
            $conts += $a
    } 

} while($a -ne $null)

Function CreaContatto {
    $mailContact = $args 
    $aliasContact = $args -replace ("@","_")
    New-MailContact -ExternalEmailAddress $mailContact -Name $mailContact -Alias $aliasContact
}

ForEach ($cont in $conts) {CreaContatto $cont}

2 个答案:

答案 0 :(得分:2)

事情是,按Enter键时$a不为空,它是换行符。如果您在write-host $a声明下方添加if,则可以看到此消息。

在这种情况下,我建议使用正则表达式:

do {
    $a = read-host "Indirizzo mail Contatto $num`?"
    if ($a -ne $null) {
            $num++
            $conts += $a
    } 

} while($a -match '.+')

这表示$a必须是一个或多个字符。

答案 1 :(得分:2)

我的猜测是,PowerGUI实现了一个自定义主机,并且在没有输入时从read-host返回null。标准PowerShell主机不这样做,它返回一个空字符串(除非你点击ctrl-z,它发出文件结束信号)。由于两者都是假的,你可以这样做:

do {
    $a = read-host "Indirizzo mail Contatto $num`?"
    if ($a) {
        $num++
        $conts += $a
    }
} while($a)