【问题标题】:RedirectStandardError $logFile with Append?带有附加的 RedirectStandardError $logFile?
【发布时间】:2020-03-28 22:15:18
【问题描述】:
我有一个 PowerShell 脚本,我在其中使用 Start-Process 并将输出重定向到日志文件。 cmd 在 for 循环中,我希望每次运行时都附加输出。现在它每次运行时都会清除日志文件。有没有办法重定向和追加?
Start-Process $cmd -ArgumentList $cmdArgs -RedirectStandardError $logFile -Wait -NoNewWindow
【问题讨论】:
标签:
powershell
logging
append
start-process
【解决方案1】:
注意:要同步执行控制台应用程序,直接调用(c:\path\to\some.exe ...或& $exePath ...),执行不使用Start-Process - 见this answer;这样,您可以使用$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 参数的预先存在的文件 -他们总是替换指定的输出文件。
This answer 展示了如何直接使用底层 .NET API,允许您收集进程的输出在内存中,然后允许您将其附加到现有文件(例如,使用
Add-Content)。
但是,正如your own answer 所示,使用带有
-RedirectStandardError 的辅助临时文件(其内容稍后会附加到整个输出文件)可能是最简单的解决方案。
[1] >> 盲目应用 Out-File 的默认编码,即 Windows PowerShell 中的 UTF-16LE(“Unicode”)和无 BOM 的 UTF-8在 PowerShell [核心] 6+ 中;相比之下,Add-Content 会尝试匹配目标文件预先存在的编码。
【解决方案2】:
感谢大家的回复。我决定采用自己的替代方案,即将每个 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
【解决方案3】:
如果你可以直接调用 cmd,你可以试试2>>:
&$cmd 2>> $logFile
详情请见SS64:
command 2>> filename # 将错误追加到文件