У меня есть script с некоторыми командами, например Write-Host "Server1"
. Как я могу экспортировать его в файл?
Когда я попытался с script > export.txt
, он не работает.
У меня есть script с некоторыми командами, например Write-Host "Server1"
. Как я могу экспортировать его в файл?
Когда я попытался с script > export.txt
, он не работает.
Write-host
перенаправить вывод только на консоль.
Вы можете использовать write-output
и перенаправить файл (> export.txt
или pipe на out-file export.txt
)
В крайнем случае, когда вам абсолютно необходимо перенаправить весь вывод из script, посмотрите на этот командлет
start-transcript
get-help start-transcript -full
В 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
Полезность разных подходов в основном будет основываться на вашем случае использования, конечно, но...
"Правильный" способ сделать это, я считаю, если у вас есть контроль над сценариями (и это то, что я обычно делаю, хотя, по общему признанию, я искал ярлык сегодня), это "перегрузка" 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
и делать все, что вы хотите, редактируя в одном месте.