记录Java输出

时间:2019-01-09 16:33:00

标签: java powershell logging

我想记录从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"无效。

1 个答案:

答案 0 :(得分:0)

使用redirection operators将输出定向到日志文件(see also)。

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-Transcript cmdlet:

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