首页 > 解决方案 > 记录 Java 输出

问题描述

我想记录从 PowerShell 启动的 Java 文件的每个输出。Java 代码在一个循环中,如下所示:

foreach ($file in Get-ChildItem $propertyFilesDir) {
    & $javaExe -classpath "$classPath" com.tech.test.Export "$PropertyFilesDir\$file"
}

记录循环的第一个输出,但不记录所有其他输出。

我还尝试了它Start-Process并重定向了stdout和sterr。打电话cmd /c "xxx"也打不通。

标签: javapowershelllogging

解决方案


使用重定向运算符将输出定向到日志文件(另请参阅)。

PowerShell v3 或更高版本:

& $javaExe ... *>> 'C:\your.log'

>>附加到文件。*将所有输出流合并为一个。

PowerShell v2 或更早版本:

& $javaExe ... >> 'C:\your.log' 2>&1

在 PowerShell v3 之前,只能重定向成功和错误输出流。不支持重定向其他流。2>&1将错误输出流与成功输出流合并,以便正常和错误输出到同一个文件。

当然,您也可以将每个流重定向到单个文件(只要支持流的重定向):

& $javaExe ... >> 'C:\output.log' 2>> 'C:\error.log' [3>> 'C:\warning.log' ...]

从控制台记录所有内容的另一个选项是Start-Transcriptcmdlet:

Start-Transcript -Path 'C:\your.log' -NoClobber
foreach ($file in Get-ChildItem $propertyFilesDir) {
    ...
}
Stop-Transcript

不起作用的是重定向整个循环输出:

foreach ($file in Get-ChildItem $propertyFilesDir) {
    ...
} > 'C:\path\to\your.log' 2>&1

您需要使用ForEach-Object而不是foreach循环才能以这种方式重定向输出:

Get-ChildItem $propertyFilesDir | ForEach-Object {
    ...
} > 'C:\path\to\your.log' 2>&1

推荐阅读