Поиск по сайту:

Каков аналог команды Echo в PowerShell?


Команда Echo — это распространенный способ вывода чего-либо в консоль при использовании пакетных или оболочных сценариев. Но в PowerShell Echo не является фактическим командлетом. Так что является эквивалентом PowerShell для вывода чего-либо?

При написании скриптов вам часто нужно выводить что-то в консоль для тестирования или отладки вашего скрипта. В старых bat-скриптах, например, вы могли использовать команду Echo для этого. Но в PowerShell у вас есть на самом деле несколько вариантов.

В этой статье мы рассмотрим различные варианты в PowerShell.

Вывод PowerShell

В PowerShell вы действительно можете использовать команду Echo. Однако это не является фактическим командлетом, а является псевдонимом для командлета Write-Output.

Если мы возьмем приведенный ниже пример, то 4 фрукта из массива будут отображены в вашем консоли.

$fruitsAvailable = @("Apple", "Banana", "Orange", "Grapes")

$fruitsAvailable | ForEach-Object {
    echo $_
}

Но, как вы, вероятно, знаете, в PowerShell также есть команда Write-Host. И есть важное различие между Write-Host и Write-Output, которое вам необходимо понять.

Команда Write-Output, а также ее псевдоним Echo, будут записывать результаты в поток вывода. В то время как команда Write-Host вернет результаты в хост, часто в вашу консоль PowerShell.

Мы можем показать разницу на следующих примерах. Код ниже будет проходить по массиву фруктов и возвращать все фрукты.

$results = $fruitsAvailable = @("Apple", "Banana", "Orange", "Grapes")

$results = $fruitsAvailable | ForEach-Object {
    Write-Host "Processing fruit $($_)"
    $_
}

Если вы запустите приведенный выше код, то в вашем консоли вы увидите следующее:

Processing fruit Apple
Processing fruit Banana
Processing fruit Orange
Processing fruit Grapes

И если вы посмотрите на переменную результатов, то получите список всех фруктов из массива:

Apple
Banana
Orange
Grapes

Но что если мы изменим Write-Host на Write-Output? Write-Output отправит результаты в поток вывода, который в данном случае является переменной $results. Но это также может быть текстовый файл, когда вы перенаправляете вывод.

$results = $fruitsAvailable = @("Apple", "Banana", "Orange", "Grapes")

$results = $fruitsAvailable | ForEach-Object {
    Write-Host "Processing fruit $($_)"
    $_
}

Итак, если вы запустите вышеуказанный код, вы ничего не увидите в консоли. Однако, если мы посмотрим на переменную $results, то увидим следующее:

Processing fruit Apple
Apple
Processing fruit Banana
Banana
Processing fruit Orange
Orange
Processing fruit Grapes
Grapes

Когда использовать Write-Output или Write-Host

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

Итак, если вы хотите показать прогресс вашего скрипта в консоли или быстро вернуть переменную, чтобы протестировать часть вашего скрипта, то Write-Host — это лучший вариант. Преимущество Write-Host в том, что вы также можете назначить разные цвета для вывода в консоль.

Еще один вариант, который стоит иметь в виду, это Write-Verbose. Подробный вывод по умолчанию скрыт, но вы можете изменить это, установив переменную $VerbosePreference в continue в вашей сессии PowerShell (или в начале вашего скрипта). Таким образом, весь подробный вывод будет отображаться.

Аналогичным вариантом является командлет Write-Debug, который вы можете включить с помощью $DebugPreference="Continue".

Заключение

Подводя итог, вы можете использовать Echo в PowerShell, но это на самом деле не нужно, и существуют лучшие варианты для отладки вашего кода или возврата результатов в консоль.

Надеюсь, вам понравится эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.