Windows cmd echo / pipe 在末尾添加了额外的 space - 如何 trim 呢?
Windows cmd echo / pipe is adding extra space at the end - how to trim it?
我正在编写一个执行命令行应用程序的脚本,该应用程序需要用户在运行时输入(遗憾的是未提供命令行参数)。
所以我的第一次尝试是这样的:
@echo off
(echo N
echo %~dp0%SomeOther\Directory\
echo Y)|call "%~dp0%SomeDirectory\SadSoftware.exe"
乍一看似乎运行良好,但事实证明并非如此。经过调查,我发现我传递给软件的目录最后包含额外的 space,这导致了一些问题。
我环顾四周,发现了以下问题:
echo is adding space when used with a pipe .
这解释了是怎么回事,但并没有真正帮助我解决问题(我对批处理编程不太熟悉)。
目前我 "kind of solved" 我的问题是一个丑陋的解决方法:
echo N> omg.txt
echo %~dp0%SomeOther\Directory\>> omg.txt
echo Y>> omg.txt
"%~dp0%SomeDirectory\SadSoftware.exe"<omg.txt
del omg.txt
此解决方案有效,但我不太满意。有没有更漂亮的方法?或者更丑陋的方式,但没有临时文件?
解决方案 1:换行
您可以使用换行符来避免 spaces。
需要 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:转义 & 符号
您也可以直接使用 & 符号,但需要对其进行转义,否则 space 无论如何都会被注入。
最后一个 rem.
是为了避免在最后一个 echo
之后出现 space
(
echo Line1^&echo Line2^&echo Line3^&rem.
) | more
解决方案 3:创建单个命令
@MCND 提到了直接使用表格的技巧:
cmd /q /c"(echo line1&echo line2&echo line3)" | sort
这是可行的,因为解析器只看到 cmd
命令,其余部分作为此单个命令的参数处理。
因此 spaces 没有任何问题。
或者换行看起来像
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)
我正在编写一个执行命令行应用程序的脚本,该应用程序需要用户在运行时输入(遗憾的是未提供命令行参数)。
所以我的第一次尝试是这样的:
@echo off
(echo N
echo %~dp0%SomeOther\Directory\
echo Y)|call "%~dp0%SomeDirectory\SadSoftware.exe"
乍一看似乎运行良好,但事实证明并非如此。经过调查,我发现我传递给软件的目录最后包含额外的 space,这导致了一些问题。
我环顾四周,发现了以下问题: echo is adding space when used with a pipe .
这解释了是怎么回事,但并没有真正帮助我解决问题(我对批处理编程不太熟悉)。
目前我 "kind of solved" 我的问题是一个丑陋的解决方法:
echo N> omg.txt
echo %~dp0%SomeOther\Directory\>> omg.txt
echo Y>> omg.txt
"%~dp0%SomeDirectory\SadSoftware.exe"<omg.txt
del omg.txt
此解决方案有效,但我不太满意。有没有更漂亮的方法?或者更丑陋的方式,但没有临时文件?
解决方案 1:换行
您可以使用换行符来避免 spaces。
需要 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:转义 & 符号
您也可以直接使用 & 符号,但需要对其进行转义,否则 space 无论如何都会被注入。
最后一个 rem.
是为了避免在最后一个 echo
(
echo Line1^&echo Line2^&echo Line3^&rem.
) | more
解决方案 3:创建单个命令
@MCND 提到了直接使用表格的技巧:
cmd /q /c"(echo line1&echo line2&echo line3)" | sort
这是可行的,因为解析器只看到 cmd
命令,其余部分作为此单个命令的参数处理。
因此 spaces 没有任何问题。
或者换行看起来像
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)