Как вывести что-то в PowerShell - PullRequest
190 голосов
/ 10 января 2010

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

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

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

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

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

  • Запись-Хост
  • Запись-Вывод
  • Ошибка записи

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

Ответы [ 7 ]

184 голосов
/ 11 января 2010

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

"Hello, World!"

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

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

115 голосов
/ 10 января 2010

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

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

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

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

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

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

8 голосов
/ 15 января 2016

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

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
7 голосов
/ 10 января 2010

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

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

2 голосов
/ 03 февраля 2015
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta

Пурпурный может быть одним из значений перечислителя "System.ConsoleColor" - Черный, Темно-синий, Темно-зеленый, Темно-коричневый, Темно-красный, Темно-пурпурный, Темно-желтый, Серый, Темно-серый, Синий, Зеленый, Голубой, Красный, пурпурный, желтый, белый.

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

2 голосов
/ 10 августа 2012

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

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

using System;

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

* 1006 Е.Г. *

PS C:\> writetostdout finally I can write to stdout like echo -n
finally I can write to stdout like echo -nPS C:\>
0 голосов
/ 28 августа 2012

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

cmd /c echo "Long string: $LongStr" 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...