2017-01-04 7 views
1

У меня есть следующий код:Отправка параметры, имеющие специальные символы в другой пакетный файл из пакетного файла

second.bat файл

echo %~1 
echo %~2 

first.bat файл

@ECHO OFF &SETLOCAL 
@SETLOCAL EnableExtensions EnableDelayedExpansion 

set /p User=Enter Username: 
set /p Password=Enter Password: 

call second.bat %User% %Password% 

Если пользователь входы Admin как имя пользователя ив качестве пароля выход производится в second.bat эхо, как показано ниже:

Admin 
Admin23 

Как я могу получить специальные символы, а также в second.bat файл, как показано ниже?

Admin 
Admin!23 
+0

Ваша 'call'ed-процедура наследует как переменные, так и' расширение', поэтому во второй подпрограмме вы можете просто «установить пользователя» и «установить пароль», чтобы увидеть фактические значения. Если вы измените эти значения во второй подпрограмме, измененное значение будет возвращено вызывающей процедуре. Поскольку 'delayedexpansion' действует, простое' echo' будет пытаться расширить свой аргумент в соответствии с обычными правилами. Чтобы использовать '!', Вам нужно отключить 'delayedexpansion' - до вызова второй подпрограммы или во второй подпрограмме. – Magoo

ответ

2

Это зависит от ваших идей!.
Можете ли вы изменить файл second.bat?

Затем вы должны перенести значения по (переменным) ссылкам вместо значений, так как CALL не очень хорошо работает со сложными значениями.

Решение 1:
Тогда вы можете изменить second.bat к

@echo off 
echo !user!, !password! 

Решение 2:
Если вы не можете изменить second.bat и требует пароль, как вызывающий параметр, вы можете изменить first.bat на

@ECHO OFF 
setlocal EnableExtensions EnableDelayedExpansion 

set /p User=Enter Username: 
set /p Password=Enter Password: 

set ^"password=!password:"=""!" 
setlocal DisableDelayedExpansion 
call second.bat "%%User%%" "%%Password%%" 
exit /b 

Это только при использовании котировок в пароле, то они удваиваются.

Решение 3:
Инъекционного кода second.bat без изменения файла.

Предполагая second.bat выглядит как

@echo off 
setlocal EnableDelayedExpansion 
set "user=%~1" 
set "pwd=%~2" 

echo !pwd! 

Изменение first.bat на:

set ^"Inject=." & (set pwd=^!password^!) & rem #" 
call second.bat "%%User%%" %%Inject%% 

Это может справиться с любой пароль, как линия в second.bat set "pwd=%~2" будет модифицированном на ходу до

set "pwd=." & (set pwd=!password!) & rem #" 
+0

К счастью, я могу редактировать second.bat так эхо! User !,! Password! работал. – Joshi

+0

Проблемы возникают, когда в пароле есть другие специальные символы и символы. Заглавные буквы удваиваются, а цитаты становятся хуже. – jeb

+0

Я не понимаю ваше второе решение: почему нет 'call' перед' second.bat'? и почему вы передаете литеральные строки '% User%' и '% Password%' в 'second.bat'? – aschipfl

1

Вам не нужно DelayedExpansion до этого момента! Если вам это нужно, активируйте его после! Если вы повторите последнюю строку вашего примера, вы увидите, что также должен отсутствовать код !.

Поскольку DelayedExpansion использует восклицательный знак в качестве специального символа, он удаляется.

 Смежные вопросы

  • Нет связанных вопросов^_^