Могу ли я написать предупреждение в сценарии PowerShell без новой строки в конце? - PullRequest
3 голосов
/ 10 июля 2020

Я хочу напечатать предупреждение в PowerShell в качестве приглашения, а затем прочитать ответ в той же строке. Проблема в том, что Write-Warning печатает новую строку в конце сообщения, а одна альтернатива, Read-Host -Prompt, не выводит приглашение в поток предупреждений (или не выводит желтым цветом). Я видел Write-Warning -WarningAction Inquire, но я думаю, что это немного многословно и предлагает варианты, которые мне не нужны.

Лучшее, что я сделал, это:

  $warningMsg= "Something is wrong. Do you want to continue anyway Y/N? [Y]:"
  Write-Host -ForegroundColor yellow -NoNewline $warningMsg
  $cont = Read-Host

Это отлично работает - печатает желтое приглашение, а затем считывает ввод в той же строке - но мне интересно узнать о предупреждениях, которые я видел против использования Write-Host, если более уместно выяснить какой-либо способ печати в потоке предупреждений без новой строки. Есть ли способ сделать это? Я заметил, что Write-Host кажется оболочкой для записи в поток информации, но я не вижу способа записывать предупреждения без новой строки (например, [Console]::Warning.WriteLine() не существует).

1 Ответ

3 голосов
/ 10 июля 2020

Вы не можете делать то, что хотите, с Write-Warning.

Поэтому я отвечу по поводу вашего другого беспокойства. Write-Host идеально подходит для использования в сценарии PowerShell 5+.

Если вы посмотрите статьи, рекомендующие не использовать его, вы заметите, что подавляющее большинство (если не все) были написаны до введения PowerShell 5.

В настоящее время Write-Host представляет собой оболочку вокруг Write-Information.

Официальная документация подтверждает это:

Запуск в Windows PowerShell 5.0 Write-Host является оболочкой для Write-Information. Это позволяет использовать Write-Host для вывода вывода в информационный поток. Это позволяет захват или подавление данных, записанных с использованием Write-Host, при сохранении обратной совместимости.

Предпочтительная переменная $InformationPreference и общий параметр -InformationAction не влияют на сообщения Write-Host. Исключением из этого правила является -InformationAction Ignore, что эффективно подавляет вывод Write-Host.

Запись в информационный поток с использованием Write-Host и / или Write-information не создаст проблем с вашей выходной строкой.

Stream #    Description          Introduced in
1           Success Stream       PowerShell 2.0
2           Error Stream         PowerShell 2.0
3           Warning Stream       PowerShell 3.0
4           Verbose Stream       PowerShell 3.0
5           Debug Stream         PowerShell 3.0
6           Information Stream   PowerShell 5.0
*           All Streams          PowerShell 3.0

Бонус

Вы также можете управлять видимостью информационного потока, если используете расширенную функцию через параметр -InformationAction, при условии, что вы также привязываете данное значение параметра к операторы Write-Host в функции.

Например, если вы хотите отключить информационный поток по умолчанию, если не требуется иное:

function Get-Stuff {
     [CmdletBinding()]
     param ()

     if (!$PSBoundParameters.ContainsKey('InformationAction')) {
        $InformationPreference = 'Ignore'
     }
     Write-Host 'This is the stuff'  -InformationAction $InformationPreference -ForegroundColor Green
}

# Hidden by default
Get-Stuff
# Force it to show
Get-Stuff -InformationAction Continue

Примечание

Хотя технически невозможно использовать Write-Warning -NoNewLine, вы можете попытаться изменить положение курсора и сбросить его до конца предыдущей строки, сделав то же самое.

Однако у меня есть ограниченный опыт в этом, и мои наблюдения по этому поводу заключались в том, что вам может потребоваться создать исключения для соответствия ограничениям некоторых консольных сред. На мой взгляд, это немного перебор ...

Дополнительные ссылки About_redirections

...