Как вывести что-то в PowerShell

Я запускаю сценарий PowerShell из пакетного файла. Скрипт извлекает веб-страницу и проверяет, является ли содержимое страницы строкой "OK".

сценарий PowerShell возвращает уровень ошибки пакетному сценарию.

пакетный скрипт выполняется с помощью ScriptFTP, программа автоматизации FTP. Если возникает ошибка, Я могу отправить scriptftp полный вывод консоли администратору по электронной почте.

в сценарии PowerShell я бы как вывести возвращаемое значение с веб-сайта, если оно не "ОК", поэтому сообщение об ошибке включается в вывод консоли и, следовательно, в сообщение о состоянии.

Я новичок в PowerShell и не уверен, какую выходную функцию использовать для этого. Я вижу три:

  • Write-Host
  • Написать-Выход
  • Write-Error

что было бы правильным использовать для записи в эквивалент Windows stdout?

7 ответов


просто выводить что - то-это вещь красоты-и одна из ее самых сильных сторон. Например, общий Привет, Мир! приложение сводится к одной строке:

"Hello, World!"

он создает объект string, присваивает вышеупомянутое значение и, будучи последним элементом в командном конвейере, вызывает .toString() метод и выводит результат в STDOUT (по умолчанию). Вещь красоты.

другое Write-* команды используются для вывода текст к их связанным потокам, и имеют свое место как таковые.


Я думаю, в этом случае вам понадобится Написать-Выход.

если у вас есть скрипт типа

Write-Output "test1";
Write-Host "test2";
"test3";

тогда, если вы вызываете скрипт с перенаправленным выходом, что-то вроде yourscript.ps1 > out.txt, вы test2 на экране test1\ntest3\n В "out.формат txt."

обратите внимание, что "test3" и строка вывода записи всегда будут добавлять новую строку в текст, и в PowerShell нет способа остановить это (то есть echo -n невозможно в PowerShell с native commands). Если вы хотите (несколько простой и легкий в Баш) функции echo -n затем посмотреть ответ samthebest.

если пакетный файл запускает команду PowerShell, он, скорее всего, захватит команду Write-Output. У меня были "длинные обсуждения" с системными администраторами о том, что следует писать на консоль, а что нет. Мы договорились, что единственная информация, если сценарий выполнен успешно или умер, должно быть Write-Host'ed, и все, что автор сценария, возможно, должен знать о выполнении (какие элементы были обновлены, какие поля были установлены и т. д.), идет на вывод записи. Таким образом, когда вы отправляете скрипт системному администратору, он может легко runthescript.ps1 >someredirectedoutput.txt и посмотреть на экране, если все в порядке. Затем отправьте " someredirectedoutput.txt " вернемся к разработчикам.


вы можете использовать любой из них в своем сценарии, так как они записываются в потоки по умолчанию (вывод и ошибка). Если бы вы передавали вывод в другой командлет, вы хотели бы использовать Написать-Выход, который в конечном итоге завершится Write-Host.

в этой статье описываются различные параметры вывода:PowerShell O предназначен для вывода


Я думаю следующее-Хороший экспонат Эхо и Write-Host. Обратите внимание, как test() фактически возвращает массив ints, а не один int, как можно легко поверить.

function test {
    Write-Host 123
    echo 456 # AKA 'Write-Output'
    return 789
}

$x = test

Write-Host "x of type '$($x.GetType().name)' = $x"

Write-Host "`$x[0] = $($x[0])"
Write-Host "`$x[1] = $($x[1])"

терминальный выход вышеуказанного:

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789

вы просто не можете получить PowerShell, чтобы опустить эти отвратительные строки. Для этого нет сценария или командлета.

конечно, Write-Host-абсолютная бессмыслица, потому что вы не можете перенаправить/pipe от него! Вы просто должны написать свой собственный:

using System;

namespace WriteToStdout
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args != null)
            {
                Console.Write(string.Join(" ", args));
            }
        }
    }
}

Э. Г.

PS C:\> writetostdout finally I can write to stdout like echo -n
finally I can write to stdout like echo -nPS C:\>

Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta

пурпурный может быть одним из " системы.Значения перечислителя" ConsoleColor " - черный, темно-синий, Темно-зеленый, темно-серый, темно-красный, темно-красный, темно-серый, темно-серый, синий, зеленый, голубой, красный, пурпурный, желтый, белый.

на + $File.FullName является необязательным, и показывает, как поместить переменную в строку.


используйте внешнюю программу, как внутри вашего сценария PowerShell:

cmd /c echo "Long string: $LongStr" 

это глупо и дорого с точки зрения запуска отдельного процесса, но PowerShell плохо спроектирован.