RedirectStandardError $ logFile с Append? - PullRequest
2 голосов
/ 29 марта 2020

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

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

Ответы [ 3 ]

2 голосов
/ 29 марта 2020

Примечание: К синхронно Выполнение консольных приложений , вызов их напрямую (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 параметры
- они неизменно заменяют указанные выходные файлы.

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

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


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

1 голос
/ 29 марта 2020

Спасибо всем за ваши ответы. Я решил go с моей собственной альтернативой, которая состояла в том, чтобы отправлять выходные данные каждого задания 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
1 голос
/ 29 марта 2020

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

&$cmd 2>> $logFile

См. SS64 для более подробной информации:

команда 2 >> filename # APPEND ошибки в файл

...