Es un buen desafío, pero esta es una técnica avanzada de lotes.
Lo usaría aquí de una manera más simple, use expansión demorada y no envíe el contenido, solo el nombre de la variable.
Esto es totalmente seguro incluso con caracteres especiales.
call foo.bat password
Foo.bat -----------------
Setlocal EnableDelayedExpansion
Echo !password!
EDIT: Solución para la pregunta original,
esta es una manera de resolverlo con el contenido en lugar de un nombre de variable
es necesario preparar el contenido antes de enviar que a través de llamada al segundo archivo por lotes.
Es difícil de usar algo como CALL foo.bat %preparedVariable%
Es que parece ser mejor usar CALL foo.bat !preparedVariable!
Pero incluso entonces yo fallo en la duplicación de signos de intercalación de la fase de llamada.
Pero luego encontré una manera simple de usar la expansión porcentual justo después de la fase 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
Para ver los verdaderos parámetros en ShowParam.bat que usar algo como esto
ShowParam.bat
@echo off
setlocal
set prompt=
@echo on
REM # %* #
Gracias, que resuelve el problema :). – briantyler
O '¡Echo!% ~ 1!' Dado que el nombre de la variable se pasó como parámetro. – dbenham
@ dbenham- Sí, esa era mi intención, pero lo olvidé mientras escribía :-) – jeb