这是代码:
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)
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)
返回的行是:
Run Code Online (Sandbox Code Playgroud)unquoted: "D:\Data"\"file.ext" quoted: ""D:\Data"\"file.ext""
您可以看到其中有一些令人不安的引言。现在让我们使用更改后的语法:
set "PDIR=D:\Data"
set "FILE=file.ext"
echo unquoted: %PDIR%\%FILE%
echo quoted: "%PDIR%\%FILE%"
Run Code Online (Sandbox Code Playgroud)
所以返回的行是:
Run Code Online (Sandbox Code Playgroud)unquoted: D:\Data\file.ext quoted: "D:\Data\file.ext"
因此,不再有令人不安的引述。
请注意,更改后的语法仅适用于启用命令扩展,但无论如何,这都是 Windows 命令提示符的默认设置cmd。