Побег пользовательского ввода в пакетном файле Windows - PullRequest
5 голосов
/ 28 марта 2012

У меня есть пакетный файл Windows, который принимает пароль как ввод пользователя:

SET /P PASSWORD=Password:

Этот пароль может содержать символы, которые необходимо экранировать, например !.Переменная PASSWORD затем передается в другие командные файлы с помощью CALL

CALL Foo.Bat %PASSWORD%

Как я могу гарантировать, что специальные символы экранируются и передаются правильно как параметр?Например, если пользователь вводит !%"£$", я хочу, чтобы %1 было !%"£$" в Foo.bat.

1 Ответ

2 голосов
/ 28 марта 2012

Это хорошая задача, но это продвинутая техника пакетной обработки.
Я бы использовал здесь более простой способ, использовал отложенное расширение и не отправлял содержимое, только имя переменной.

Это абсолютно безопасно даже со специальными символами.

call foo.bat password

Foo.bat -----------------

Setlocal EnableDelayedExpansion
Echo !password!

РЕДАКТИРОВАТЬ: Решение для исходного вопроса,
это способ решения проблемы с содержимым вместо имени переменной

Необходимо подготовить содержимое до отправки через CALL во второй пакетный файл.
Трудно использовать что-то вроде CALL foo.bat %preparedVariable%
Кажется, лучше использовать CALL foo.bat !preparedVariable!
Но даже тогда мне не удается удвоить количество карет в фазе CALL.

Но потом я нашел простой способ использовать процентное расширение сразу после фазы CALL.

@echo off

setlocal DisableDelayedExpansion
rem set /p "complex=Complex Input "
set "complex=xx! & "!^&"ab^^ " ^^^^cd%%"

setlocal EnableDelayedExpansion

call :prepareForCallBatch complex PreparedParam
echo Send   =!PreparedParam!#
set complex
echo(
call ShowParam.bat %%PreparedParam%%
exit /b

:: Prepare special characters &|<>"^ for a batch call
:prepareForCallBatch
set "temp=!%~1!"

set "temp=!temp:^=^^!"
set "temp=!temp:&=^&!"
set "temp=!temp:|=^|!"
set "temp=!temp:<=^<!"
set "temp=!temp:>=^>!"
set "temp=!temp:"=^^"!"
set "%~2=!temp!"
exit /b

Чтобы увидеть параметры real в ShowParam.bat, я использую что-то вроде этого
ShowParam.bat

@echo off
setlocal
set prompt=
@echo on
REM # %* #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...