Это хорошая задача, но это продвинутая техника пакетной обработки.
Я бы использовал здесь более простой способ, использовал отложенное расширение и не отправлял содержимое, только имя переменной.
Это абсолютно безопасно даже со специальными символами.
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 # %* #