пакетный файл: передать параметр с пробелами для функции

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

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% расширяется до «Documente und Einstellungen».

В этом случае TARGET правильный, но FILES == "Documente" и EXCLUDE == "und", что означает, что сценарий не работает из-за пробелов в %DIRUSER%.

Как я могу это исправить?


person Matthias Pospiech    schedule 13.07.2011    source источник


Ответы (2)


Проблема, похоже, в вашем стиле назначения переменных.
Я полагаю, вы установили переменную 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   
person jeb    schedule 14.07.2011

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

Дополнительная информация: http://www.windowsitpro.com/article/server-management/how-do-i-pass-parameters-to-a-batch-file-

person Costa    schedule 13.07.2011