Аналог echo в PowerShell


В PowerShell не обязательно использовать echo или аналогичные команды, поскольку по умолчанию поведением для строк является их вывод.

К примеру если ввести число и нажать Enter, то оно будет выведено на экран:

12345
12345

Если ввести строку в двойных кавычках и нажать Enter, то она также будет выведена на экран:

"Just a string"
Just a string

Аналогично для строк в одинарных кавычках:

'Another string'
Another string

Тем не менее, если ввести строку без кавычек (как число), то это вызовет ошибку

The term '…...' is not recognized as a name of a cmdlet, function, script file, or executable program.

Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

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

Аналогично вывод содержимого переменных не требует echo или других командлетов:

$String = "Строка в переменной"
$String

И при этом в PowerShell имеется поддержка команды echo:


echo 'Just a string'

Ещё пример:

$String = "Строка в переменной";
echo $String

А также есть командлеты для вывода информации:

  • Write-Host
  • Write-Output
  • Write-Information

Можно запутаться, правда?

Для начала уясним, что echo является синонимом Write-Output.

Командлет Write-Information предназначен для вывода обработчиков потоков информации и является сложным по сравнению с обычной функцией echo — его мы рассматривать не будем.

Итак, изучим Write-Host и Write-Output.

Особенности echo в PowerShell

Прежде всего, обратите внимание на разницу в выводе строке, содержащей пробелы, в кавычках и без:

echo Just a string
Just
a
string

echo 'Just a string'
Just a string

Как уже было сказано, echo является псевдонимом для Write-Output, поэтому рассмотрим этот командлет подробнее, чтобы понять другие особенности echo в PowerShell.

Write-Output

Командлет Write-Output отправляет указанный объект по конвейеру следующей команде. Если команда является последней командой в конвейере, объект отображается в консоли.

Write-Output отправляет объекты по основному конвейеру, также известному как «выходной поток» или «конвейер SUCCESS». Чтобы отправить объекты ошибок по конвейеру ошибок, используйте Write-Error.

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

Get-Process | Write-Output

эквивалентно

Get-Process

Итак, одной из особенностей echo и Write-Output является то, что эти команды не требуются.

Другая особенность — эти команды работают с объектами, поэтому простая строка с запятыми может быть выведена не так, как вы ожидаете.

К примеру, команда

Write-Output 1,2,3

Выведет:

1
2
3

Аналогично:

Write-Output Just a string
Just
a
string

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

Пример 1: Получение объекта и вывод его в консоль

$P = Get-Process
Write-Output $P

Первая команда получает список процессов, запущенных на компьютере, и сохраняет их в переменной $P.

Вторая команда отображает объекты процесса в $P на консоли.

Пример 2: Передача вывода другому командлету


Write-Output "test output" | Get-Member

Эта команда передаёт строку «test output» командлету Get-Member, который отображает члены класса System.String, демонстрируя, что строка была передана по конвейеру.

Пример 3: Подавление перечисления в выводе

Write-Output @(1,2,3) | Measure-Object

Вывод:

Count    : 3
...

 

Write-Output @(1,2,3) -NoEnumerate | Measure-Object

Вывод:

Count    : 1
...

Эта команда добавляет параметр -NoEnumerate для обработки коллекции или массива как одного объекта в конвейере.

Write-Host

Командлет Write-Host является продвинутым аналогом Write-Output.

Командлет Write-Host настраивает вывод. Вы можете указать цвет текста, используя параметр -ForegroundColor, и вы можете указать цвет фона, используя параметр -BackgroundColor. Параметр -Separator позволяет указать строку (символ или набор символов), которая будет использоваться для разделения отображаемых объектов. Конкретный результат зависит от программы, в которой размещается PowerShell.

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


Опции Write-Host

-BackgroundColor

Падает цвет фона. По умолчанию значение не установлено. Допустимые значения для этого параметра:

  • Black
  • DarkBlue
  • DarkGreen
  • DarkCyan
  • DarkRed
  • DarkMagenta
  • DarkYellow
  • Gray
  • DarkGray
  • Blue
  • Green
  • Cyan
  • Red
  • Magenta
  • Yellow
  • White

-ForegroundColor

Задает цвет текста. По умолчанию значение не установлено. Допустимые значения для этого параметра:

  • Black
  • DarkBlue
  • DarkGreen
  • DarkCyan
  • DarkRed
  • DarkMagenta
  • DarkYellow
  • Gray
  • DarkGray
  • Blue
  • Green
  • Cyan
  • Red
  • Magenta
  • Yellow
  • White

-NoNewline

Параметр делает так, что строковые представления входных объектов объединяются для формирования выходных данных. Между строками вывода не вставляются пробелы или символы новой строки. Новая строка не добавляется после последней выходной строки.


-Separator

Падает разделительную строку для вставки между объектами, отображаемыми хостом.

Write-Host отправляет объекты на хост. Сам командлет не возвращает никаких объектов. Однако хост может отображать объекты, которые посылает ему Write-Host.

Примеры Write-Host

Пример 1: Запись в консоль без добавления символа новой строки:

Write-Host "no newline test " -NoNewline; Write-Host "second string"

Эта команда отображает строку «no newline test» с параметром -NoNewline.

Затем записывается вторая строка, но она оказывается на той же строке, что и первая, из-за отсутствия символа новой строки, разделяющей строки.

Сравните с поведением по умолчанию:

Write-Host "no newline test "; Write-Host "second string"

Пример 2: Запись в консоль и замена стандартного разделителя

Write-Host (2,4,6,8,10,12) -Separator ", +2= "
2, +2= 4, +2= 6, +2= 8, +2= 10, +2= 12

Эта команда отображает чётные числа от двух до двенадцати. Параметр -Separator используется для добавления строки «, +2= » (запятая, пробел, +, 2, =, пробел)`.

Пример 3: Вывод с другим цветом текста и фона

Write-Host (2,4,6,8,10,12) -Separator ", -> " -ForegroundColor DarkGreen -BackgroundColor White

Эта команда отображает чётные числа от двух до двенадцати. Она использует параметр -ForegroundColor для вывода темно-зеленого текста и параметр -BackgroundColor для отображения белого фона.

Пример 4: Вывод с разными цветами текста и фона

Write-Host "Red on white text." -ForegroundColor red -BackgroundColor white

Эта команда отображает строку «Red on white text». Текст имеет красный цвет, как определено параметром -ForegroundColor. Фон является белым, как определено параметром -BackgroundColor.

Пример 5: Подавление вывода от Write-Host

# Следующие два оператора могут использоваться для эффективного подавления вывода от Write-Host
Write-Host "I won't print" -InformationAction Ignore
Write-Host "I won't print" 6>$null

Эти команды эффективно подавляют вывод командлета Write-Host. Первый использует параметр -InformationAction со значением «Ignore» для подавления вывода в информационный поток. Второй пример перенаправляет информационный поток команды в переменную «$null» и тем самым подавляет его.

Подавление вывода echo и Write-Output

Для подавления вывода echo и Write-Output используется одинаковая конструкция:

echo 'Эта строка не будет показана' > $null
Write-Output 'Эта строка не будет показана' > $null

Подавление стандартного вывода

Стандартный вывод могут показывать не только echo и Write-Output. Поэтому конструкция «> $null» может работать не всегда.

Как было показано выше, иногда информационный поток имеет другой номер, например:

Write-Host "I won't print" 6>$null

Тем не менее, в большинстве случаев для подавления вывода достаточно перенаправить поток в «$null»:

Get-ChildItem > $null

Заключение

Итак, для вывода в консоль можно использовать следующие команды:

  • Write-Output
  • echo (псевдоним Write-Output)
  • Write-Information (вывод с возможностью поменять текст цвета и фона).

Ещё парочка примеров применения вывода в консоль. Следующая команда покажет строку «Current user: », а затем на этой же строке выведет результат работы команды «whoami»:

Write-Host "Current user: " -NoNewline; Write-Host $(whoami)

В следующем пример содержимое файла записывается в переменную, затем значение переменной выводится в консоль:

$From = Get-Content -Path .\CopyFromFile.txt
$From

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *