回复 8# yyykkkyyyy
管道中能实现变量延迟的原因是管道为内部命令启用了新的 cmd /c,所以实际执行的是:- %comspec% /s /d /c" echo %%str%%"|findstr .
- ::在批中执行 echo %%cmdcmdline%%|findstr . 即可看到证明
复制代码 类似的还有 for /f:- for /f "delims=" %%a in ('echo %%str%%') do echo %%a
- ::其实质运行的也是 %comspec% /c echo %%str%%
复制代码 cmd /c 虽然也能对输入的参数进行一次额外的预处理,但是毕竟和 call 的二次扩展特性不一样,前者必须启用新进程,后者则不然。
所以相比而言,最常用的还是 !str!,不求效率或者万不得已的情况下也是尽量选择 call echo %%str%%,而非以 cmd /c echo %%str%% 的方式来进行延迟解释。 |