Write-Host => Экспорт в файл - PullRequest
       17

Write-Host => Экспорт в файл

14 голосов
/ 15 февраля 2012

У меня есть скрипт с некоторыми командами, такими как Write-Host "Server1". Как я могу экспортировать его в файл?

Когда я попробовал с script > export.txt, это не сработало.

Ответы [ 3 ]

23 голосов
/ 15 февраля 2012

Write-Host перенаправляет вывод только на консоль.

Вы можете использовать Write-Output и перенаправить в файл (> export.txt или канал в Out-File export.txt)

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

Start-Transcript
Get-Help Start-Transcript -full
9 голосов
/ 15 февраля 2012

В PowerShell script > export.txt является синтаксическим сахаром для script | Out-File -path export.txt.

Write-Host отправляет объекты на хост, и не возвращает никаких объектов. Это означает, что никакие объекты не передаются в командлет Out-File и ничего не записывается в файл export.txt. Обходной путь (в случае, если вы не хотите менять свой сценарий) - открыть консоль cmd и перенаправить вывод PowerShell с помощью перенаправления консоли cmd.

C:\> powershell .\script.ps1 > .\export.txt
6 голосов
/ 06 февраля 2015

Полезность различных подходов в значительной степени будет зависеть от вашего варианта использования, конечно, но ...

Я считаю, что "правильный" способ сделать это, если у вас есть контроль надсценарии (и это то, что я обычно делаю, хотя по общему признанию я искал ярлык сегодня), "перегрузить" Write-Host, так сказать, и затем отправить все, что вы хотите 'Мы отправили Write-Host этой новой функции.

Чтобы остаться с действительными глаголами PowerShell, я называю мои Write-Feedback.

function Write-Feedback()
{
    param
    (
        [Parameter(Position=0,ValueFromPipeline=$true)]
        [string]$msg,
        [string]$BackgroundColor = "Yellow",
        [string]$ForegroundColor = "Black"
    )

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
}

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

Вы можете просто изменить строку на Write-Output, в зависимости от того,делать что-нибудь еще по конвейеру ...

...
Write-Output $msg;

Вы можете отправить вывод в тот же файл, в который вы отправляете остальную часть команды, но внутри функции Write-Feedback, даже сохраняяWrite-Host тоже:

function Write-Feedback()
{
    param
    (
        [Parameter(Position=0,ValueFromPipeline=$true)]
        [string]$msg,
        [string]$BackgroundColor = "Yellow",
        [string]$ForegroundColor = "Black"
    )

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
    $msg | Out-File "./export.txt" -Append; # <<< or add a param to location
}

Или, если у вас есть несколько выбросов, где вы не хотите, чтобы содержимое Write-Feedback передавалось в файл, вы можете добавить новый необязательный параметр, который спрашивает, чтоделать с каждым конкретным Write-Feedback вызовом, который вы switch отключаете - и отправлять в файл, на Write-Host, на Write-Output и т. д., изменяя значение по умолчанию на то, что вы обычно хотите, и явно switch ingот нового параметра, где он явно установлен.

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

Я думаю, что единственная боль здесь будет, если вы не захотитедля отправки по конвейеру, так что Write-Output отсутствует, но он действительно хотел убедиться, что файл Write-Feedback, в который был записан файл, совпадает с тем, который вы указали в > export.txt из своего примера, не редактируя Write-Feedback каждый раз,Я не уверен, есть ли простой способ сделать это.

Но так как вы уже были бы на шаг отстранены от своего "шага трубы", это, вероятно, недопустимый вариант использования.

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

...