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

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

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

3 ответа

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

Ты можешь использовать write-output и перенаправить в файл (> export.txt или труба к out-file export.txt)

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

start-transcript 
get-help start-transcript -full

В 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

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

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

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

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

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

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

У меня работает *> вместо>. Он перенаправляет весь вывод в файл; на экране ничего не отображается.

Другие вопросы по тегам