Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在';对于';DOS命令_Batch File_Sed_Cmd - Fatal编程技术网

Batch file 在';对于';DOS命令

Batch 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

以下批次在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 ('%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)