使用BAT文件时出错。 - 此时R意外发生

时间:2016-11-25 12:05:05

标签: batch-file cmd

这是代码:

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 (

1 个答案:

答案 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的默认设置。