Обработка точки с запятой в командной строке - PullRequest
2 голосов
/ 19 марта 2010

У меня есть два пакетных файла, которые используются для запуска большой сборки C ++, первый запускает процессы, создает каталоги и выясняет, что отправить во второй скрипт. Если определенная информация представлена ​​в первом сценарии, у меня есть подпрограмма, которая выскакивает окно и запрашивает пароль. Это передается второму сценарию путем вызова второго сценария, подобного этому

call script2.bat -pw:myPassword

где myPassword - это то, что ввел пользователь. Сейчас я тестировал этот скрипт, и один из моих пользовательских паролей содержит точку с запятой, поэтому мы получаем это

call script2.bat -pw:my;Password

Я нашел, заключив в кавычки, я могу получить это во втором скрипте ОК

call script2.bat -pw:"my;Password"

Однако, разбор командной строки прерывается, когда я пытаюсь сделать это

for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b

если я echo %1 это показывает вот так

-pw:"my;Password"

Но с включенным эхо при запуске скрипта я вижу

for /F "tokens=1,2 delims=:" %%a in ( "-pw:"my Password"" ) DO SET switch=%%a&value=%%b

и обрабатывается как switch=-pw и value="my

В конечном итоге мне нужно, чтобы значение содержало мой пароль; чтобы я мог передать его другой программе

Любые идеи о том, как заставить это разобрать правильно

Вот 2 пакетных файла, которые решают проблему:

a.bat:

echo on

call b.bat -pw:eatme
call b.bat -pw:eat;me
call b.bat -pw:"eat;me"
call "b.bat -pw:\"eat;me\""

b.bat:

echo on

echo %1

for /F "tokens=1,2 delims=: " %%a in ( "%1" ) DO SET switch=%%a&SET value=%%b 

echo switch=%switch% 
echo value=%value%

Ответы [ 5 ]

3 голосов
/ 19 марта 2010

Я нашел небольшую хитрость, чтобы обойти интерпретацию оболочкой значения "% 1" в цикле FOR / F: вместо анализа строки проанализируйте вывод команды ECHO %1, например, так:

FOR /F "tokens=1,2 delims=:" %%a IN ( 'ECHO %1' ) DO ECHO Switch: %%a Value: %%b

Это работает, если вы введете пароль в кавычки в командной строке (call script2.bat -pw="my;password"), поэтому нам придется удалить кавычки следующим образом:

SET VALUE=%VALUE:~1,-1%

Вот код, который я придумал:

ECHO OFF

ECHO Arguments: %1

FOR /F "tokens=1,2 delims=:" %%a IN ( 'ECHO %1' ) DO (
    SET SWITCH=%%a
    SET VALUE=%%b
)

ECHO SWITCH: %SWITCH%

SET VALUE=%VALUE:~1,-1%
ECHO VALUE: %VALUE%

... который возвращает следующие результаты:

Arugments: -pw: "мой; пароль"
ВЫКЛЮЧАТЕЛЬ: -pw
ЗНАЧЕНИЕ: мой; пароль

3 голосов
/ 19 марта 2010

Попробуйте убежать от; с ^.

call script2.bat "-pw:my^;Password"
0 голосов
/ 10 сентября 2018

вместо

for /F "tokens=1,2 delims=:" %%a in ( "%1" ) DO SET switch=%%a&value=%%b

использование

for /F "tokens=1,2 delims=:" %%a in ( "%~1" ) DO SET switch="%%~a" & SET value="%%~b"

или (желательно, по моему мнению)

for /F "tokens=1,2 delims=:" %%a in ( "%~1" ) DO (
    SET switch="%%~a"
    SET value="%%~b"
)

Проверьте HELP CALL и HELP FOR, чтобы узнать о синтаксисе% ~ для удаления цитаты.

0 голосов
/ 17 августа 2010

Я создал пакетную «функцию», которая выполняет «правильный» анализ аргументов и правильно обрабатывает знаки равенства и точки с запятой. Я думаю, вы обнаружите, что это может помочь вам решить эти проблемы. Полную информацию и пример можно найти на моем сайте: http://skypher.com/index.php/2010/08/17/batch-command-line-arguments/

0 голосов
/ 19 марта 2010

Попробуйте поместить скрипт в двойные кавычки ... точка с запятой - это разделитель команд, чтобы вы могли вводить несколько команд в одной строке. В старые времена DOS и с DOSKEY вы могли отделить команды, нажав Ctrl + T, который теперь является точкой с запятой в сегодняшнем процессоре командной строки. Не беспокойтесь о кавычках, поскольку командный процессор все равно сможет их анализировать, поэтому двойные кавычки используются для обхода длинных соглашений о именах файлов и путях.

call "script2.bat -pw:\"my;Password\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...