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



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



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



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



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



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




  • Write-Host

  • Write-Output

  • Write-Error


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

3520   7  

7 ответов:

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

"Hello, World!"

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

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

Я думаю, в этом случае вам понадобится Write-Output.

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

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

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

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

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

вы можете использовать любой из них в своем сценарии, так как они записываются в потоки по умолчанию (вывод и ошибка). Если бы вы передавали вывод в другой командлет, вы бы хотели использовать Write-Output, который в конечном итоге закончится в 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 " значения перечислителя-черный, темно-синий, Темно-зеленый, темно-красный, темно-красный, темно-желтый, серый, темно-серый, синий, зеленый, голубой, красный, пурпурный, желтый, белый.

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

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

cmd /c echo "Long string: $LongStr" 

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

Comments

    Ничего не найдено.