我知道这不是我喜欢的做事方式,但我过去创建了一个复杂的批处理(.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