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
行为的系统),有什么方法可以使它工作吗?我在这里失踪了什么?
答案 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