2009-07-31 2 views
145

У меня есть сценарий PowerShell, для которого я хотел бы перенаправить вывод в файл. Проблема в том, что я не могу изменить способ вызова этого сценария. Поэтому я не могу:Как перенаправить вывод PowerShell в файл во время его выполнения

.\MyScript.ps1 > output.txt 

Как перенаправить вывод скрипта PowerShell во время его выполнения?

ответ

136

Возможно, Start-Transcript будет работать на вас. Сначала остановите его, если он уже запущен, затем запустите его и остановите, когда закончите.

 
$ErrorActionPreference="SilentlyContinue" 
Stop-Transcript | out-null 
$ErrorActionPreference = "Continue" 
Start-Transcript -path C:\output.txt -append 
# do some stuff 
Stop-Transcript 

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

EDIT: Если вы хотите, чтобы полностью подавить ошибку при попытке остановить транскрипт, не переписывание, вы можете сделать это:

$ErrorActionPreference="SilentlyContinue" 
Stop-Transcript | out-null 
$ErrorActionPreference = "Continue" # or "Stop" 
+12

Обратите внимание, что запись начала записи не записывает запись стандартного вывода Write-Error, Write-Verbose или Write-Debug .... –

+3

@richard: похоже, сейчас. Возможно, это дополнение 2.0, не уверен, что все эти ответы относятся к 1.0. –

+0

Я использую почти тот же код выше. моя проблема в том, что Stop-Transcript | out-null по-прежнему отправляет сообщение об ошибке, если транскрипция не запущена. Мне нужно подавить сообщение, поскольку оно испортило мой макет. -террористическое молчание не помогает. есть идеи? – Mel

20

Одно из возможных решений, если ситуация это позволяет:

  1. Rename MyScript.ps1 в TheRealMyScript.ps1
  2. Создать новый MyScript.ps1, который выглядит как:.

    \ TheRealMyScript. ps1> output.txt

16

Вы можете взглянуть на командлете Tee-Object , Вы можете выводить трубку на Tee, и она будет записываться в конвейер, а также в файл

+1

«выход» | Set-Content -PassThru и «вывод» | Add-Content -PassThru также будет работать как Tee-Object, с дополнительным преимуществом, которое вы можете установить для кодировки. –

33

Microsoft имеет announced on Powershell's Connections web site (2/15/2012 at 4:40 PM), что в версии 3.0 они расширили перенаправление в качестве решения этой проблемы.

In PS 3.0, we've extended output redirection to include the following streams: 
Pipeline (1) 
Error (2) 
Warning (3) 
Verbose (4) 
Debug (5) 
All  (*) 

We still use the same operators 
> Redirect to a file and replace contents 
>> Redirect to a file and append to existing content 
>&1 Merge with pipeline output 

См. Статью справки «about_Redirection» для получения более подробной информации и примеров.

help about_Redirection 
+1

Не говорю Мне нравится это решение. На самом деле, я нахожу это уродливым, трудно запоминающимся и негибким. Кажется, что добавление параметров захвата потока в командлеты Out- *, Set-Content и Add-Content сделало бы трюк более мощным способом Powershelly. Пока они находятся на нем, они также должны добавить параметр -PassThru. Это позволило бы сделать менее полезным командлет Tee-Object устаревшим. –

+0

Я смущен, как это отвечает на вопрос? «Как перенаправить вывод скрипта PowerShell ** во время ** его выполнения?» – Zoredache

+0

Вы правы, @Zoredache, я, кажется, упустил из виду, что «не может изменить способ вызова этого сценария». При захвате большинства вывода, Start-Transcript - это способ пойти. Должен ли я удалить этот ответ? –

24

Написать «Начать писать» | Out-File OutputFile.txt -Append

+0

это работает, только если файл уже существует –

+0

не решает вопрос OP, потому что он не работает «во время выполнения». Но я дал ему +1, потому что полезно знать, как подключаться в Pow В любом случае. –

2
.\myscript.ps1 | Out-File c:\output.csv 

Если вы хотите сделать это из командной строки, а не встроенный в сам скрипт

+6

Ответчик явно объясняет, что вызов сценария не может быть изменен. – Fer

+0

Не связанный с вопросом, но полезный для меня, я был googling, чтобы получить правильный синтаксис с Pipe to Out-File. – gReX

0

Чтобы встроить это в сценарии, вы можете сделать это следующим образом:

 Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append 

Это должно сделать трюк.

9

Полагаю, вы можете изменить MyScript.ps1. Затем попробуйте изменить его следующим образом:

$(
    here is your current script 
) *>&1 > output.txt 

Я просто попытался это с Powershell 3. Вы можете использовать все варианты перенаправления, как в ответ Натан Хартли.

+0

Мне нравится это решение. Вы можете использовать >> output.txt для добавления. Кто-нибудь знает, есть ли способ создать это ascii вместо unicode? –

+0

Вы можете попробовать что-то вроде этого: '*> & 1 | Out-File $ log -Encoding ascii -Append -Width 132', но Powershell действительно уродлив, если вам нужно точно контролировать вывод. –

+0

Когда все остальное не получилось, это сработало. – sfuqua

2

Если вы хотите прямую переадресацию всех вывод в файл, попробуйте использовать *>>:

# You'll receive standard output for the first command, and an error from the second command. 
mkdir c:\temp -force *>> c:\my.log ; 
mkdir c:\temp *>> c:\my.log ; 

Поскольку это прямой редирект в файл, он не будет выводиться на консоль (часто полезно). Если вы хотите выход консоли, в сочетании все выходные с *&>1, а затем трубу с Tee-Object:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ; 
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ; 

# shorter aliased version 
mkdir c:\temp *>&1 | tee -Append c:\my.log ; 

Я считаю, что эти методы поддерживаются Powershell 3.0+, я тестирую на Powershell 5.0.

+0

Я думаю, что «* &> 1» должен читать «*> & 1», правильно? –

+0

@JanHoek спасибо, обновлено. – sonjz

5
powershell ".\MyScript.ps1" > test.log 
+0

Это было * только * из многих параметров, которые работали для моего вывода скриптов. – cori

Смежные вопросы