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)
我有一个奇怪的问题。 想要创建一个脚本,让输入用户插入一个字符串,然后在输入请求中再次循环,直到留空。
该脚本在 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)