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

发布于 2024-11-19 22:37:05 字数 649 浏览 2 评论 0原文

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

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% 中的空格而失败。

我该如何解决这个问题?

I am using a batch file for backups. I pass the options to a function which calls the packaging executable. This works unless the parameters contain whitespaces. This is the relevant code:

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

On XP(german version) %DIRUSER% expands to "Dokumente und Einstellungen"

In that case TARGET is correct, but FILES == "Dokumente" and EXCLUDE == "und",
which means that the script fails because of the whitespaces in %DIRUSER%.

How can I fix this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

So尛奶瓶 2024-11-26 22:37:06

问题似乎是您分配变量的方式。
我想您像其他变量一样设置了 DIRUSER 变量

set DIRUSER="Dokumente und Einstellungen"

,但是 DIRUSER 的内容是“Dokumente und Einstellungen”,因此引号是内容的一部分。

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

您可以使用set的扩展样式。
设置“var=内容”
这会将 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   

The problem seems to be your style of assigning the variables.
I suppose you set the DIRUSER variable like the other ones

set DIRUSER="Dokumente und Einstellungen"

But the content of DIRUSER is then "Dokumente und Einstellungen", so the quotes are a part of the content.

But then SET FILES="%DIRUSER%\Eigene Dateien\*" expands to SET FILES=""Dokumente und Einstellungen"\Eigene Dateien\*".

You could use the extended style of set.
set "var=content"
This sets the content of var to content without any quotes and also all appended spaces behind the last quote are ignored.

So your code would be

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   
乖乖哒 2024-11-26 22:37:06

将函数中的 arg 调用从 %~1%~2%~3 切换为 %~f1 >、%~f2%~f3 分别应该可以解决问题。它将传递每个参数的完全限定路径名。

更多信息:http ://www.windowsitpro.com/article/server-management/how-do-i-pass-parameters-to-a-batch-file-

Switching your arg calls in the function from %~1, %~2 and %~3 to %~f1, %~f2 and %~f3 respectively should do the trick. It'll pass the fully qualified path name for each arg.

More info: http://www.windowsitpro.com/article/server-management/how-do-i-pass-parameters-to-a-batch-file-

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文