使用 Powershell 批处理到时髦的输出追加 (>>) 重定向时出现的问题



我知道这不是我喜欢的做事方式,但我过去创建了一个复杂的批处理(.bat(。我现在有了一个新的需求,需要用不同的参数调用批处理,这需要计算。因此,我使用powershell(.ps1(进行计算,并将其作为批处理的参数提供。批处理在内部调用groovy(v3.0.4(程序并输出到stdout。

当我通过在批处理(.bat:直接指定参数(和powershell(.ps1:通过计算指定参数(之间切换来附加(>>(重定向groovy的stdout输出时,我发现在groovy stdout的每个字符之间都打印了[x0]。这种情况仅发生在powershell(.ps1(重定向时。我已经通过创建一个perl程序来删除它们来规避这个问题:s/[x0]//g;。然而,我想知道发生了什么。

我简化了设置以重现问题。当执行下面的run.bat时,可以重现此问题。如果用Windows记事本打开附加的(>>(重定向文件(print.log(,您会发现每个字符之间都有间隙。如果用二进制编辑器或二进制查看器打开同一个文件,则会发现间隙实际上是[x0]。以下是设置说明。

主批处理文件的内容(run.bat(

call printBatch.bat -key=value '-key2=value2' "-key3=value3" > print.log
powershell printPowerShell.ps1 print

printPowerShell.ps1的内容

.printBatch.bat -key=value '-key2=value2' "-key3=value3" >> ($args[0] + ".log")

打印内容Batch.bat

java groovy.ui.GroovyMain ./print.groovy %1 %2 %3 %4 %5 %6 %7 %8 %9

打印内容.groovy

for (int argIndex = 0; argIndex < args.size(); argIndex++) {
println("[${argIndex}] = "${args[argIndex]}"")
}

在groovy的stdout的每个字符之间插入[x0]仅在批处理到powershell之间切换时发生,并且仅在powershell重定向时发生。请注意,powershell(.ps1(文件包含追加(>>(重定向。如果仅使用批处理或仅使用powershell对其进行追加(>>(重定向,则不会发生这种情况。

感谢Compo提供的信息。我知道最初的设置都是ASCII,我了解到如果groovy打印非ASCII字符和/或如果.ps1包含非ASCII字符,比如so(key4=value4,"終わり"(:

printPowerShell.ps1的内容

.print.bat -key=value '-key2=value2' "-key3=value3" key4=value4 >> ($args[0] + ".log")

打印内容.groovy

for (int argIndex = 0; argIndex < args.size(); argIndex++) {
println("[${argIndex}] = "${args[argIndex]}"")
}
println("終わり") // End in Japanese

printPowerShell.ps1的内容应更改如下:

--->printPowerShell.ps1的内容

$PSDefaultParameterValues = @{"Out-File:Encoding"="default"}
.print.bat -key=value '-key2=value2' "-key3=value3" key4=value4 key5=value5 >> ($args[0] + ".log")

附加版本信息(供参考(

  • Windows10Home(版本:1903,内部版本:18362.1082,日语(
  • 命令提示符:10.0.18362.1082
  • PowerShell:5.1.18362.752
  • Groovy:v3.0.4

最新更新