Powershell 中奇怪的不可阻挡的 Do-While 循环

Strange unstopable Do-While cycle in 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}

问题是,$a按回车键时不为空,它是一个换行符。如果您在 if 语句下方添加 write-host $a ,就可以看到这一点。

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

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

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

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

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

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