gpt4 book ai didi

batch-file - echo 与管道一起使用时会增加空间

转载 作者:行者123 更新时间:2023-12-03 03:00:55 26 4
gpt4 key购买 nike

在回答this时问题我发现了一些奇怪的行为,我无法解释

for /f "delims=" %a in ('(for /l %z in (1,1,10^) do @echo %z^)') do @echo %a0

您将看到数字 10..100,现在只需添加管道,例如排序更多,无论如何:

for /f "delims=" %a in ('(for /l %z in (1,1,10^) do @echo %z^)^|sort') do @echo %a0

%a0 之间会添加空格!看起来像通过管道回显某些内容会添加尾随空格,很容易看出:

>_tempfile echo no space here
>_tempfile echo and here's a space|more

甚至

>_tempfile <nul set /p =also a space|sort

(可能使用 echo 打印提示)

当没有输出重定向(无论是文件还是命令)时,不会发生这种情况。这是一个错误还是我错过了什么?我如何摆脱空间? (除了用 var:~0,-1 删除最后一个字符的肮脏黑客行为)

最佳答案

优秀且有趣的问题(+1)

空格是由 CMD 解析器的管道机制引入的,而不是由 SORT 引入的。

当您使用 FOR/F 执行命令时,该命令将在其自己的 CMD shell 中执行。此外,管道的每一端都在其自己的 CMD shell 中执行。请参阅Why does delayed expansion fail when inside a piped block of code?了解更多信息。

因此,您的命令实际上实例化了 3 个 CMD shell,其中一个用于 FOR/F 命令,该命令又为管道的每一侧创建 2 个。

您可以查看如何使用 %CMDCMDLINE% 动态变量解析命令并将其输入 CMD shell。因为我们是从命令行执行命令,所以我们需要对变量名中的至少一个字符进行两次转义,以便它在到达最内部的 CMD shell 之前不会被扩展。

这是包含结果的命令(前导 > 是我的命令提示符):

>for /f "delims=" %a in ('(echo %^^^cmdcmdline%^&for /l %z in (1,1,10^) do @echo %z^)^|sort') do @echo %a0
1 0
10 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
C:\Windows\system32\cmd.exe /S /D /c" ( echo %cmdcmdline% & FOR /L %z in (1 1 10) do @ echo %z )" 0

输出的最后一行是用于管道左侧的命令行。您可以看到解析器如何在多个位置添加空格。

您可以通过使用简单的批处理脚本来回显该值而不是 ECHO 命令来规避该问题。

echoArgs.bat

@echo(%*

现在,当您运行此命令时,您将获得所需的结果

>for /f "delims=" %a in ('(for /l %z in (1,1,10^) do @echoArgs %z^)^|sort') do @echo %a0
10
100
20
30
40
50
60
70
80
90

规避该问题的另一种方法是使用 ECHO 命令创建一个变量并适本地转义该变量的扩展。

>set cmd=@(echo %z)

>for /f "delims=" %a in ('(for /l %z in (1,1,10^) do %^^^cmd%^)^|sort') do @echo %a0
10
100
20
30
40
50
60
70
80
90
<小时/>

编辑

>_tempfile echo 和这里的 space|more 示例也很有趣。输出文件末尾有一个额外的空格。但查德·努伊斯(Chad Nouis)是正确的,因为左侧的重定向,没有任何内容被排序。右侧可以使用任何命令,结果都是一样的。

问题的根源仍然是解析器,但解析器重组命令的方式很有趣。

>>_tempfile echo %^cmdcmdline%|rem

>type _tempfile
C:\Windows\system32\cmd.exe /S /D /c" echo %cmdcmdline% 1>_tempfile"

请注意重定向是如何从命令的开头移动到结尾的,并且显式添加了 1 的文件句柄。您当然可以看到额外的空间来自哪里。

关于batch-file - echo 与管道一起使用时会增加空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10948824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com