'for'dos命令

时间:2016-02-25 02:11:02

标签: batch-file sed cmd

以下批次在win 7 x64下使用GNU sed版本4.0.7进行测试

for /f "delims=" %%a in ('"%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"') do (echo %%a)

但是错误发生了。

如果添加“call”或删除“sed.exe”的引号,则错误消失。

删除quate标记,

for /f "delims=" %%a in ('%UnxUtils_path%\sed.exe -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"') do (echo %%a)

但它不适用于包含SPACE的sed.exe的完整路径,

添加“通话”,

for /f "delims=" %%a in ('call "%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"') do (echo %%a)

这可以。

如果直接测试命令,

"%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"

也没关系。

那么第一种语法的问题是什么?

1 个答案:

答案 0 :(得分:2)

当您运行for /f %a in ('someCommand') do ...之类的命令时,将按如下方式启动新的命令进程(路径可能会更改):c:\Windows\system32\cmd.exe /c someCommand

替换你的实际命令,你得到:
"%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"

如果您浏览CMD帮助(help cmdcmd /?),您将看到如果命令的第一个和最后一个字符是引号,CMD将删除前导和尾随引号。这导致:
%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt
你应该能够看出为什么会失败。

这也解释了为什么它在你添加CALL时有效 - 命令不再以引号开头,因此不会删除引号。

通过将整个命令包含在一组额外的引号中,可以在不使用CALL的情况下运行命令。但是,应该对这些额外的引号进行转义,以免在初始解析阶段干扰引用:

for /f "delims=" %%a in ('^""%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"^"') do (echo %%a)