for循环中的多个引号(批处理文件)

multiple quotation marks in for loop (batch file)

拥有一个使用 7-Zip 来“查看”zip 文件(如果它包含特定文件)的批处理文件。

"C:\Program Files-Zipz.exe" l "FolderName\archive.zip" "file.cmd"

但是将它放入 for 循环中会产生错误:'cannot find "C:\Program" '。写入 %ProgramFiles% 也没有区别。

for /F "delims=" %%a in ('"C:\Program Files-Zipz.exe" l "FolderName\archive.zip" "file.cmd"') do ...

但是,如果我省略 zip 文件和搜索的文件周围的引号,它会起作用。

for /F "delims=" %%a in ('"C:\Program Files-Zipz.exe" l FolderName\archive.zip file.cmd') do ...

最后我找到了一个解决方案,将命令放在一个变量中并将其放入for循环中。

set command="C:\Program Files-Zipz.exe" l "FolderName\archive.zip" "file.cmd"
for /F "delims=" %%a in ('"%command%"') do ...

变量仍然需要引号。我想了解它是如何工作的。我怎样才能将多个带引号的字符串放在带引号的变量中,但不能将它们直接传递给 for 循环。

这似乎是一个类似于&、>、|、...等运算符需要用^转义的问题。我也尝试过,但没有成功。它让我问:“更多?”因此不再找到右括号。

嗯,你居然没仔细看就回答了自己的问题。 让我告诉你为什么:

set command="C:\Program Files-Zipz.exe" l "FolderName\archive.zip" "file.cmd"
for /F "delims=" %%a in ('"%command%"') do ...

请注意,您的代码将 set 命令的值转换为:

"C:\Program Files-Zipz.exe" l "FolderName\archive.zip" "file.cmd"

然后您再次将其传递给双引号中的循环,如:

"%command%"

结果是:

""C:\Program Files-Zipz.exe" l "FolderName\archive.zip" "file.cmd""

这将在 for 循环中准确工作:

for /f "delims=" %%i in ('""C:\Program Files-Zipz.exe" l "FolderName\archive.zip" "file.cmd""') do ...

虽然在这种情况下会按预期工作,但如果引用的字符串包含特殊字符,如 &,它将失败,如本例所示:

for /f "delims=" %%i in ('""C:\Program Files-Zipz.exe" l "FolderName\archives & backups.zip" "file.cmd""') do ...

所以你需要简单地转义外部双引号来克服这个问题:

for /f "delims=" %%i in ('^""C:\Program Files-Zipz.exe" l "FolderName\archives & backups.zip" "file.cmd"^"') do ...

cmd /? 中的第 2 点似乎说明了这种行为,如下面的屏幕截图所示: