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
и делай что хочешь, редактируя в одном месте.
У меня работает *> вместо>. Он перенаправляет весь вывод в файл; на экране ничего не отображается.