为什么不选择某些"对于"输出通过管道传输时命令有效吗?

时间:2015-03-13 03:01:13

标签: windows batch-file

作为我看到的问题的一个例子,命令

for /D %%i in (*) do @if not exist m:\home\%%i echo %%i

给我一​​个当前目录中不存在于另一个目录中的目录列表。

但是,如果我想将输出传递给另一个命令,例如:

(for /D %%i in (*) do @if not exist m:\home\%%i echo %%i) | findstr /n .

我收到此错误消息:

echo was unexpected at this time.

请注意,我不能将括号括起来,因为这会导致每次迭代循环时管道运算符被处理一次;我需要将循环的输出通过管道传递给应用程序的单个实例。例如,如果我在此示例中将括号括起来,则findstr中的行号将始终显示为1,而不是计算目录数。

是否有人知道如何使这项工作,最好是在一般情况下,而不仅仅是这个具体的例子?

Windows 7 SP1 x64。

2 个答案:

答案 0 :(得分:2)

根据Eryksun的评论,这绝对是一个错误。它可以通过显式创建子进程来解决,而不是让批处理器为您执行此操作:

cmd /s /c "for /D %%i in (*) do @if not exist m:\home\%%i echo %%i" | findstr /n .

另一种选择是手动注入缺失的空间,将%space%定义为单个空格并说:

(for /D %%i in (*) do @if not exist ^%%space^%% m:\home\%%i echo %%i) | findstr /n .

答案 1 :(得分:2)

解析器的问题是具有特殊IF语法形式,如:

  

如果存在   如果定义了   IF errorlevel
  IF x EQU y

但是这个没有问题

  

IF x == y

可以通过定义包含单个IF的变量来解决。

set "_IF_=IF"
( %%_IF_%% defined path echo It's defined ) | more
( %%_IF_%% errorlevel 0 echo Errorlevel is 0 or above ) | more

这是有效的,因为%%_IF_%%将在子进程解析块之前进行扩展。