пакетный файл: передать параметр с пробелами в функцию - PullRequest
10 голосов
/ 14 июля 2011

Я использую командный файл для резервного копирования.Я передаю параметры функции, которая вызывает исполняемый файл упаковки.Это работает, если параметры не содержат пробелов.Это соответствующий код:

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"and EXCLUDE ==" und ", что означает, что скрипт завершился ошибкой из-за пробелов в% DIRUSER%.

Как это исправить?

Ответы [ 2 ]

12 голосов
/ 14 июля 2011

Кажется, проблема в вашем стиле присвоения переменных.
Я полагаю, вы устанавливаете переменную 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 голосов
/ 14 июля 2011

Переключение вызовов arg в функции с %~1, %~2 и %~3 на %~f1, %~f2 и %~f3 соответственно должно помочь. Он передаст полное имя пути для каждого аргумента.

Подробнее: http://www.windowsitpro.com/article/server-management/how-do-i-pass-parameters-to-a-batch-file-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...