gpt4 book ai didi

窗口命令 : problems with for/f with a quoted command with quoted parameters

转载 作者:可可西里 更新时间:2023-11-01 13:29:45 25 4
gpt4 key购买 nike

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

前面两行都返回系统找不到指定的文件

我一直无法让它工作,既没有转义引号,也没有加倍引号,前面有反斜杠,将单引号更改为反引号并在 for 命令中设置相应的选项,所有组合我试过失败了。

如果要运行的命令被引用并且它接受引用的参数,它将失败。

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

但是如果确实需要命令周围的引号(并且我知道系统禁用了 8dot3name 行为),有什么方法可以让它工作吗?我在这里错过了什么?

最佳答案

这里有两种解决方案。

1) 周围有双引号并删除了 ^ 转义字符。
2) 在路径上使用查找。

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

'c:\windows\notepad""something.txt' 不是内部或外部命令,也不是可运行的程序或批处理文件。

最后一个提供了外部引号被删除的线索。

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.

关于窗口命令 : problems with for/f with a quoted command with quoted parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com