RedirectStandardError $logFile с добавлением?

У меня есть сценарий PowerShell, в котором я использую Start-Process и перенаправляю вывод в файл журнала. cmd находится в цикле for, и я хотел бы, чтобы вывод добавлялся каждый раз, когда он запускается. Сейчас он стирает файл журнала при каждом запуске. Есть ли способ перенаправить и добавить?

Start-Process $cmd -ArgumentList $cmdArgs -RedirectStandardError $logFile -Wait -NoNewWindow

person Paul Wasserman    schedule 28.03.2020    source источник


Ответы (3)


Примечание. Чтобы синхронно выполнять консольные приложения, вызывайте их напрямую (c:\path\to\some.exe ... или & $exePath ...), не делайте используйте Start-Process - см. этот ответ; таким образом, вы можете записывать их выходные данные напрямую с помощью $ouput = c:\path\to\some.exe ... или добавлять их выходные данные в существующий файл с помощью >> или передавать их по конвейеру в Add-Content[1] — см. about_Redirection

  • Используйте перенаправление 2>&1 в сочетании с >> $logFile, чтобы также получать стандартный вывод ошибок вместе со стандартным выводом.
& $cmd $cmdArgs 2>&1 >> $logFile
  • Используйте перенаправление 2>> $logFile для захвата только стандартного вывода ошибок.
& $cmd $cmdArgs 2>> $logFile

Остальная часть этого ответа посвящена вопросу как задано:


Нет, (начиная с PowerShell 7.0) невозможно добавлять существующие файлы с помощью Start-Process'
-RedirectStandardOutput и -RedirectStandardError параметры
— они неизменно заменяют указанные выходные файлы.

В этом ответе показано, как напрямую использовать базовый API .NET, что позволяет собирать выходные данные процесса в памяти. , который затем позволяет добавить его в существующий файл (например, с помощью
Add-Content).

Однако, как показывает ваш собственный ответ, использование вспомогательного временного файла с
-RedirectStandardError, содержимое которого позже добавляется к общий выходной файл, вероятно, является самым простым решением.


[1] >> слепо применяет кодировку Out-File по умолчанию, то есть UTF-16LE ("Unicode") в Windows PowerShell и UTF-8 без BOM в PowerShell [Core] 6+; Add-Content, напротив, пытается сопоставить уже существующую кодировку целевого файла.

person mklement0    schedule 28.03.2020

Спасибо всем за ваши ответы. Я решил пойти со своей собственной альтернативой, которая заключалась в том, чтобы отправлять выходные данные каждого задания Start-Process во временный файл журнала, а затем копировать данные из временного файла журнала в мой основной файл журнала. Не так элегантно, но достаточно просто и работает.

$logFile = "C:\work\myLogFile.log"
$logFileTemp = "C:\work\myTempLogFile.log"
Start-Process $cmd -ArgumentList $cmdArgs -RedirectStandardError $logFileTemp -Wait -NoNewWindow
Get-Content $logFileTemp | Out-File $logFile -Append
person Paul Wasserman    schedule 28.03.2020

Если вы можете просто вызвать cmd напрямую, вы можете попробовать 2>>:

&$cmd 2>> $logFile

Дополнительные сведения см. в разделе SS64:

команда 2>> имя_файла # ДОБАВЛЯТЬ ошибки в файл

person Bassie    schedule 28.03.2020