加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows cmd echo/pipe最后会增加额外的空间 – 如何修剪它?

发布时间:2020-12-14 02:30:30 所属栏目:Windows 来源:网络整理
导读:我正在编写一个执行命令行应用程序的脚本,该应用程序需要在运行时输入用户(很遗憾,不提供命令行参数). 所以我的第一次尝试看起来像这样: @echo off(echo Necho %~dp0%SomeOtherDirectoryecho Y)|call "%~dp0%SomeDirectorySadSoftware.exe" 乍一看,它看
我正在编写一个执行命令行应用程序的脚本,该应用程序需要在运行时输入用户(很遗憾,不提供命令行参数).

所以我的第一次尝试看起来像这样:

@echo off
(echo N
echo %~dp0%SomeOtherDirectory
echo Y)|call "%~dp0%SomeDirectorySadSoftware.exe"

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

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

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

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

echo N> omg.txt
echo %~dp0%SomeOtherDirectory&;> omg.txt
echo Y>> omg.txt

"%~dp0%SomeDirectorySadSoftware.exe"<omg.txt

del omg.txt

这个解决方案有效,但我对它不满意.有更漂亮的方式吗?甚至更丑陋的方式,但没有临时文件?

解决方法

解决方案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:Windowssystem32cmd.exe  /S /D /c" (<space>echo line1<space>&<space>echo line2<space>)"

所以换行技巧会产生类似的线条

C:Windowssystem32cmd.exe  /S /D /c" ( echo line1%LF%rem. & echo line2%LF%rem. )"

这扩展到了

( echo line1
rem. & echo line2
rem. )

解决方案2:逃脱的&符号
您也可以直接使用&符号,但它们需要转义,否则无论如何都会注入空格.
最后一个.是在最后一次回声后避开空格

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读