批处理文件:将带有空格的参数传递给函数

10

我正在使用一个批处理文件进行备份。我将选项传递给一个调用打包可执行文件的函数。这有效,除非参数中包含空格。以下是相关代码:

SET TARGET="%SAVEDIR%\XP.User.Documents.rar"
SET FILES="%DIRUSER%\Eigene Dateien\*"      
SET EXLUCDE="%DIRUSER%\Documents\CDs" 
call:funcBackup %TARGET% %FILES% %EXLUCDE%

:funcBackup
    SET TARGET=%~1
    SET FILES=%~2
    SET EXCLUDE=%~3     
    echo."%PACKER% a -r -x"%EXCLUDE%" "%TARGET%" "%FILES%""
    ::call %PACKER% a -r -x"%EXCLUDE%" "%TARGET%" "%FILES%"
goto:eof

在XP(德语版本)中,%DIRUSER%会扩展为“Dokumente und Einstellungen”。

在这种情况下,TARGET是正确的,但FILES ==“Dokumente”且EXCLUDE ==“und”,这意味着脚本因%DIRUSER%中的空格而失败。

我该如何解决这个问题?

2个回答

12

问题似乎在于您分配变量的方式。
我猜您设置DIRUSER变量的方式与其他变量的方式相同

set DIRUSER="Dokumente und Einstellungen"

但是DIRUSER的内容包含在"Dokumente und Einstellungen"中,因此引号是内容的一部分。

但是SET FILES="%DIRUSER%\Eigene Dateien\*"会扩展为SET FILES=""Dokumente und Einstellungen"\Eigene Dateien\*"

您可以使用set的扩展样式。
set "var=content" 这将将var的内容设置为content,不包括任何引号,并且忽略最后一个引号后面的所有附加空格。

所以您的代码应该是

set "SAVEDIR=D:\backup"
set "diruser=Dokumente und Einstellungen"
SET "TARGET=%SAVEDIR%\XP.User.Documents.rar"
SET "FILES=%DIRUSER%\Eigene Dateien\*"      
SET "EXLUCDE=%DIRUSER%\Documents\CDs" 
call:funcBackup "%TARGET%" "%FILES%" "%EXLUCDE%"
goto :eof

:funcBackup
    SET "TARGET=%~1"
    SET "FILES=%~2"
    SET "EXCLUDE=%~3"
    echo."%PACKER% a -r -x"%EXCLUDE%" "%TARGET%" "%FILES%"
    ::call %PACKER% a
goto :eof   

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接