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

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

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

Ответ 1

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

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

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

start-transcript 
get-help start-transcript -full

Ответ 2

В PowerShell script > export.txt используется синтаксический сахар для script | Out-File -path export.txt.

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

C:\> powershell .\script.ps1 > .\export.txt

Ответ 3

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

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

Просто чтобы остаться с действующими глаголами PowerShell, я вызываю my 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 off - и отправить в файл, Write-Host, на Write-Output и т.д. - изменить значение по умолчанию на то, что вы обычно хотите, и явно switch отменить новый параметр, где он явно установлен.

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

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

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

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