使用 BAT 文件时出错。——此时R出乎意料

Den*_*nis 1 cmd batch-file

这是代码:

call n:\xxx\xxx\variables.bat %1 %2 %3 %4 %5 %6

set yourZipPassword=%xxx%
set yourFolderPath="n:\xxxx\xxxx\%xxxx%"

for /R "%yourFolderPath%" %%I in ("*.zip") do (
  "C:\Program Files\7-Zip\7z.exe" x -p%yourZipPassword% -y -o"%%~dpI" "%%~fI" 
)
Run Code Online (Sandbox Code Playgroud)

不知道如何处理这个错误 - “ R 此时出乎意料。

这个bat文件停留在这一行并且不再处理:

for /R "%yourFolderPath%" %%I in ("*.zip") do (
Run Code Online (Sandbox Code Playgroud)

asc*_*pfl 5

set将语法从...更改:

set yourFolderPath="n:\xxxx\xxxx\%xxxx%"
Run Code Online (Sandbox Code Playgroud)

...以下(一般情况):

set "yourFolderPath=n:\xxxx\xxxx\%xxxx%"
Run Code Online (Sandbox Code Playgroud)

所以引号不再是值的一部分。正如您在问题中所说,for /R循环 ( for /R "%yourFolderPath%") 接收类似 的根路径for /R ""n:\xxxx\xxxx\%xxxx%"",因此它被“过度引用”。这会造成问题,特别是在变量值中存在空格和/或特殊字符的情况下。


更改后的set语法还有另一个优点:想象一下,您有一个变量保存目录路径,另一个变量保存文件名,使用问题中的语法:

set PDIR="D:\Data"
set FILE="file.ext"
Run Code Online (Sandbox Code Playgroud)

现在让我们连接这些值:

echo unquoted: %PDIR%\%FILE%
echo quoted: "%PDIR%\%FILE%"
Run Code Online (Sandbox Code Playgroud)

返回的行是:

unquoted: "D:\Data"\"file.ext"
quoted: ""D:\Data"\"file.ext""
Run Code Online (Sandbox Code Playgroud)

您可以看到其中有一些令人不安的引言。现在让我们使用更改后的语法:

set "PDIR=D:\Data"
set "FILE=file.ext"

echo unquoted: %PDIR%\%FILE%
echo quoted: "%PDIR%\%FILE%"
Run Code Online (Sandbox Code Playgroud)

所以返回的行是:

unquoted: D:\Data\file.ext
quoted: "D:\Data\file.ext"
Run Code Online (Sandbox Code Playgroud)

因此,不再有令人不安的引述。


请注意,更改后的语法仅适用于启用命令扩展,但无论如何,这都是 Windows 命令提示符的默认设置cmd