【问题标题】:Windows cmd echo / pipe is adding extra space at the end - how to trim it?Windows cmd echo / pipe 最后添加了额外的空间 - 如何修剪它?
【发布时间】:2015-06-27 03:47:37
【问题描述】:

我正在编写一个执行命令行应用程序的脚本,该应用程序需要用户在运行时输入(遗憾的是没有提供命令行参数)。

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

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

乍一看,它看起来运行良好,但事实证明并非如此。经过调查,我发现我传递给软件的目录最后包含额外的空间,这导致了一些问题。

我看了一会儿,发现了以下问题: echo is adding space when used with a pipe.

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

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

echo N> omg.txt
echo %~dp0%SomeOther\Directory\>> omg.txt
echo Y>> omg.txt

"%~dp0%SomeDirectory\SadSoftware.exe"<omg.txt

del omg.txt

此解决方案有效,但我对此不太满意。有没有更漂亮的方法?或者更丑的方式,但没有临时文件?

【问题讨论】:

    标签: windows batch-file pipe echo


    【解决方案1】:

    解决方案 1:换行

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

    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后面有空格

    ( 
        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)
    

    【讨论】:

    • 只是为了完成,也许你可以包括cmd /q /c"(echo line1)&amp;(echo line2)&amp;(echo line3)"|more
    • 谢谢!我使用了第二种解决方案,它就像一个魅力。 ^_^
    • 感谢您的出色回答。我以这种方式使用了 Solution2(cmets 中不允许新行,因此“”在这里是一个新行):(&lt;crlf&gt; echo b^&amp; ^&lt;crlf&gt; echo a^&amp; ^&lt;crlf&gt; rem.&lt;crlf&gt; ) | sort 所以你不必将所有内容放在一行中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多