这是代码:
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"
)
不知道如何处理此错误 - “ R此时出乎意料。”
这个bat文件停留在这一行而不再处理:
for /R "%yourFolderPath%" %%I in ("*.zip") do (
答案 0 :(得分:4)
从......:
更改set
语法
set yourFolderPath="n:\xxxx\xxxx\%xxxx%"
...以下(一般):
set "yourFolderPath=n:\xxxx\xxxx\%xxxx%"
因此报价不再是价值的一部分。正如您在问题中所说的那样,for /R
循环(for /R "%yourFolderPath%"
)会收到类似for /R ""n:\xxxx\xxxx\%xxxx%""
的根路径,因此它“过度引用”。这构成了一个问题,特别是在变量值中存在空格和/或特殊字符的情况下。
更改后的set
语法还有另一个好处:想象一下,您有一个包含目录路径的变量,另一个包含文件名的变量,使用您问题中的语法:
set PDIR="D:\Data"
set FILE="file.ext"
现在让我们连接这些值:
echo unquoted: %PDIR%\%FILE%
echo quoted: "%PDIR%\%FILE%"
返回的行是:
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%"
所以返回的行是:
unquoted: D:\Data\file.ext quoted: "D:\Data\file.ext"
所以没有更令人不安的报价。
请注意,更改的语法仅适用于command extensions enabled,但这仍是Windows命令提示符cmd
的默认设置。