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 点似乎说明了这种行为,如下面的屏幕截图所示:
拥有一个使用 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 点似乎说明了这种行为,如下面的屏幕截图所示: