У меня странная проблема. Хотите создать сценарий, который вводит пользователя для вставки строки, а затем повторяет цикл во входном запросе, пока не останется пустым.

Сценарий хорошо работает в PowerGUI, продолжая запрашивать входной запрос, пока я не нажму только [Enter], после чего сценарий продолжится. Проблема возникает, когда я пытаюсь использовать скрипт в оболочке PowerShell. Нажатие только [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}
1
smark91 6 Фев 2015 в 18:48

2 ответа

Лучший ответ

Я предполагаю, что PowerGUI реализует настраиваемый хост и возвращает ноль из read-host, когда нет ввода. Стандартный хост PowerShell этого не делает, он возвращает пустую строку (если вы не нажмете ctrl-z, что сигнализирует об окончании файла). Поскольку оба являются ложными, вы можете сделать это:

do {
    $a = read-host "Indirizzo mail Contatto $num`?"
    if ($a) {
        $num++
        $conts += $a
    }
} while($a)
2
Mike Zboray 6 Фев 2015 в 16:00

Дело в том, что $a не равно нулю при нажатии Enter, это новая строка. Вы можете убедиться в этом, если добавите write-host $a под своим if выпиской.

В этом случае я бы предложил использовать регулярное выражение:

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

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

Это говорит о том, что $a должен быть одним или несколькими символами.

2
arco444 6 Фев 2015 в 15:56