以下批次在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"
也没关系。
那么第一种语法的问题是什么?
答案 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 cmd
或cmd /?
),您将看到如果命令的第一个和最后一个字符是引号,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)