È una bella sfida, ma questa è una tecnica batch avanzata.
Vorrei utilizzare qui un modo più semplice, utilizzare l'espansione ritardata e non inviare il contenuto, solo il nome della variabile.
Questo è assolutamente sicuro anche con caratteri speciali.
call foo.bat password
Foo.bat -----------------
Setlocal EnableDelayedExpansion
Echo !password!
EDIT: Soluzione per la domanda iniziale,
questo è un modo per risolverlo con il contenuto anziché con un nome variabile
È necessario preparare il contenuto prima dello inviando tramite CALL al secondo file batch.
E 'difficile usare qualcosa come CALL foo.bat %preparedVariable%
E' sembra essere meglio usare CALL foo.bat !preparedVariable!
Ma anche allora non riesco a raddoppio CARETS dalla chiamata fase.
Ma poi ho trovato un modo semplice per utilizzare l'espansione percentuale subito dopo 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
Per vedere le reali parametri ShowParam.bat io uso qualcosa di simile
ShowParam.bat
@echo off
setlocal
set prompt=
@echo on
REM # %* #
Grazie, che risolve il problema :). – briantyler
Oppure "Echo!% ~ 1!" Poiché il nome della variabile è stato passato come parametro. – dbenham
@ dbenham- sì, questa era la mia intenzione, ma l'ho dimenticato mentre scrivevo :-) – jeb