批处理文件:将带有空格的参数传递给函数
我正在使用批处理文件进行备份。我将选项传递给调用打包可执行文件的函数。除非参数包含空格,否则此方法有效。这是相关代码:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题似乎是您分配变量的方式。
我想您像其他变量一样设置了 DIRUSER 变量
,但是 DIRUSER 的内容是“Dokumente und Einstellungen”,因此引号是内容的一部分。
但随后
SET FILES="%DIRUSER%\Eigene Dateien\*"
扩展为SET FILES=""Dokumente und Einstellungen"\Eigene Dateien\*"
。您可以使用
set
的扩展样式。设置“var=内容”
这会将
var
的内容设置为content
,不带任何引号,并且最后一个引号后面的所有附加空格都将被忽略。所以你的代码是
The problem seems to be your style of assigning the variables.
I suppose you set the DIRUSER variable like the other ones
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 toSET FILES=""Dokumente und Einstellungen"\Eigene Dateien\*"
.You could use the extended style of
set
.set "var=content"
This sets the content of
var
tocontent
without any quotes and also all appended spaces behind the last quote are ignored.So your code would be
将函数中的 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-