Windows cmd回声/pipe道在最后增加额外的空间 – 如何修剪它?

我正在执行一个脚本,该脚本执行一个命令行应用程序,需要用户在运行时input(可惜命令行参数没有提供)。

所以我的第一次尝试是这样的:

@echo off (echo N echo %~dp0%SomeOther\Directory\ echo Y)|call "%~dp0%SomeDirectory\SadSoftware.exe" 

乍一看,它看起来很好,但事实certificate它没有。 经过调查,我发现我传递给软件的目录最后包含了额外的空间,导致了一些问题。

我环顾了一下,发现了下面的问题: echo使用pipe道时增加了空间 。

这解释了发生了什么,但并没有真正帮助我解决问题(我对批处理编程不太熟悉)。

目前我“解决了”一个丑陋的解决方法我的问题:

 echo N> omg.txt echo %~dp0%SomeOther\Directory\>> omg.txt echo Y>> omg.txt "%~dp0%SomeDirectory\SadSoftware.exe"<omg.txt del omg.txt 

这个解决scheme有效,但我不满意。 有没有更漂亮的方法? 甚至更丑陋的方式,但没有临时文件?

解决方案1:换行

您可以使用换行来避免空格。
rem. 需要避免注入& cmd.exe的问题

 SET LF=^ REM ** The two empts lines are required for the new line ** ( echo line1%%LF%%rem. echo line2%%LF%%rem. echo line3%%LF%%rem. ) | sort 

当一个块被传送时,cmd.exe将通过在每个命令之间构建一个与“&”字符相结合的单行来重建该块。

 ( echo line1 echo line2 ) | sort 

将被转换为

 C:\Windows\system32\cmd.exe /S /D /c" (<space>echo line1<space>&<space>echo line2<space>)" 

所以换行技巧的结果就像是

 C:\Windows\system32\cmd.exe /S /D /c" ( echo line1%LF%rem. & echo line2%LF%rem. )" 

这扩大到

 ( echo line1 rem. & echo line2 rem. ) 

解决方案2:转义&符号
你也可以直接使用&符号,但是它们需要被转义,否则空间被注入。
最后的rem. 是为了避免在最后的回声之后的空间

 ( echo Line1^&echo Line2^&echo Line3^&rem. ) | more 

解决方案3:创建一个命令
@MCND提到了直接使用表单的技巧:

 cmd /q /c"(echo line1&echo line2&echo line3)" | sort 

这是有效的,因为解析器只能看到cmd命令,其余的则作为这个命令的参数处理。
因此,空间没有任何问题。 或者看起来像是换行

 cmd /q /c"(echo line1%%LF%%echo line2%%LF%%echo line3)"| (sort > out.txt) 

然后你可以修改它也

 cmd /q /c^"(echo line1%%LF%%^ echo line2%%LF%%^ echo line3)^"| (sort > out.txt)