Batch file 在';对于';DOS命令
以下批次在win 7 x64下进行测试,GNU sed版本为4.0.7Batch file 在';对于';DOS命令,batch-file,sed,cmd,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”的引号,则错误消失 去掉四分标记 for /f "delims=" %%a in ('%Unx
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”的引号,则错误消失
去掉四分标记
for /f "delims=" %%a in ('%UnxUtils_path%\sed.exe -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"') do (echo %%a)
但它不适用于包含空格的sed.exe的完整路径
添加“呼叫”
这可以
如果直接测试命令
"%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"
也可以
那么第1个语法的问题是什么呢?当您在('someCommand')do…中为/f%a运行类似于
的命令时,将启动一个新的命令进程,如下所示(路径可能会更改):c:\Windows\system32\cmd.exe/c someCommand
替换实际命令,您将得到:
%UnxUtils\u path%\sed.exe“-nr”/%pattern%/s/(^^^[^,]*,)([0-9])(,.*)/\1\3/p“file.txt”
如果浏览CMD帮助(help CMD
或CMD/?
),您将看到,如果命令的第一个和最后一个字符是引号,CMD将去掉前导和尾随引号。这将导致:
%UnxUtils\u path%\sed.exe“-nr”/%pattern%/s/(^^^[^,]*,)([0-9])(,.*)/\1\3/p”file.txt
您应该能够了解这失败的原因
这也解释了为什么在添加CALL时它会起作用-命令不再以引号开头,因此不会删除引号
通过将整个命令括在一组额外的引号内,可以在不调用的情况下运行该命令。但是,应转义这些额外的引号,以免在初始解析阶段干扰引号:
for /f "delims=" %%a in ('^""%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"^"') do (echo %%a)
求你了,谢谢。它在添加一个或多个引号后运行。但是为什么,对于sed.exe,这个引号必须添加^。另一个命令可以不带^引用。例如,对于/f“delims=“%%a in(''%UnxUtils_path%\md5sum.exe“-b”file.txt”“)do(echo%%a)
,如果不使用额外的引号集,则会引用命令的某些部分,从而在初始批处理解析阶段防止有毒字符。例如,-nr
后面引用的参数包含插入符号。只要引用了那个论点,它就行了。但是,当您添加额外的未转义引号集时,参数在初始解析期间不再被引用,因此每个插入符号都必须转义为^
。通过转义外引号,命令的正确部分将保留为引号。谢谢。你是对的。根据你提到的,我复习了cmd/?
。我简化了for
命令中设置的sed
命令,并再次对其进行了测试for/f“delims=“%%a in(”“%UnxUtils_path%\sed.exe”-nr“s/[0-9]//p”“file.txt”“)do(echo%%a)
和for/f“delims=“%%a in(”“%UnxUtils_path%\sed.exe”-nr“s/^[0-9]//p”“file.txt”“)do(echo%%a)
也可以运行,不会出现错误,因为引号之间没有
或转义。
for /f "delims=" %%a in ('^""%UnxUtils_path%\sed.exe" -nr "/%pattern%/ s/(^^[^,]*,)([0-9])(,.*)/\1 \3/ p" "file.txt"^"') do (echo %%a)