作为我看到的问题的一个例子,命令
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。
答案 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_%%
将在子进程解析块之前进行扩展。