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