windows cmd:带引号参数的带引号命令的for / f问题

时间:2014-03-25 13:37:57

标签: windows batch-file cmd

for /f "delims=" %%a in ('"%systemRoot%\system32\find.exe" /?') do @echo %%a

是的,上一行有效。没什么用,但有效。但是尝试编写一个批处理文件来回答另一个问题,我遇到了像

这样的问题
 for /f %%a in ('"%systemRoot%\system32\find.exe" /c /v "" ^< "c:\something.txt"') do @echo %%a
 for /f %%a in ('"%systemRoot%\system32\find.exe" /c /v ""    "c:\something.txt"') do @echo %%a

前两行都返回The filename, directory name, or volume label syntax is incorrect

 for /f %%a in ('"%systemRoot%\system32\find.exe" /c /v "" ^< c:\something.txt'  ) do @echo %%a
 for /f %%a in ('"%systemRoot%\system32\find.exe" /c /v ""    c:\something.txt'  ) do @echo %%a

前两行都返回The system cannot find the file specified

我一直无法使其工作,既没有删除引号,也没有将它们加倍,在反斜杠之前,更改为单引号以反引号并在for命令中设置相应的选项,所有组合都是我试过失败了。

如果引用了要运行的命令并且它带有引用参数,则它将失败。

是的,我知道不需要find周围的引号,如果删除,前四行中的任何一行都可以工作(忽略输出,delim,tokens)

但是在确实需要使用命令的引号的情况下(并且我知道禁用8dot3name行为的系统),有什么方法可以使它工作吗?我在这里失踪了什么?

2 个答案:

答案 0 :(得分:7)

这是两个解决方案。

1)包含双引号并删除^转义字符 2)在路径上使用find。

for /f %%a in ('""%systemRoot%\system32\find.exe" /c /v "" < "c:\something.txt""') do @echo %%a

for /f %%a in (' find.exe /c /v "" ^< "c:\something.txt"') do @echo %%a

启动额外的cmd进程以在for命令中运行命令行。

奇怪的是,这三个命令在更简单的上下文中会有所不同。

for /f %%a in (' "c:\windows\system32\find.exe" /c /v ""  something.txt ') do @echo %%a

系统找不到指定的路径。

for /f %%a in (' "c:\windows\system32\findstr.exe" /n "."  something.txt ') do @echo %%a

目录名无效。

for /f %%a in (' "c:\windows\notepad" "something.txt" ') do @echo %%a

&#39; C:\ WINDOWS \记事本&#34; &#34; something.txt&#39;不被识别为内部或外部命令,可操作程序或批处理文件。

最后一条提供了外部引号被剥离的线索。

Windows 8.1 32位

我认为在调用子进程时,cmd /?中会引用引用问题:

If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic is
used to process quote (") characters:

    1.  If all of the following conditions are met, then quote characters
        on the command line are preserved:

        - no /S switch
        - exactly two quote characters
        - no special characters between the two quote characters,
          where special is one of: &<>()@^|
        - there are one or more whitespace characters between the
          two quote characters
        - the string between the two quote characters is the name
          of an executable file.

    2.  Otherwise, old behavior is to see if the first character is
        a quote character and if so, strip the leading character and
        remove the last quote character on the command line, preserving
        any text after the last quote character.

答案 1 :(得分:0)

将第一个令牌从for循环的指令放入没有引号的令牌中要容易一些。

for /f "delims=" %%a in (
' if defined OS "C:\my folder with spaces\consoleapp.exe" /param1:"value" '
)do @echo %%a