2012-03-28 12 views
5

Ho un file batch di Windows che accetta un password come input da parte dell'utente:Fuga input dell'utente nel file di finestre batch di

SET /P PASSWORD=Password: 

Questa password potrebbe avere caratteri che hanno bisogno di fuga come !. Il PASSWORD variabile poi viene passata ad altri file batch usando CALL

CALL Foo.Bat %PASSWORD% 

Come posso garantire che i caratteri speciali vengono scappati e superato correttamente come parametro? Ad esempio se l'utente immette !%"£$", voglio %1 in !%"£$" in Foo.bat.

risposta

2

È 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 # %* # 
+0

Grazie, che risolve il problema :). – briantyler

+0

Oppure "Echo!% ~ 1!" Poiché il nome della variabile è stato passato come parametro. – dbenham

+0

@ dbenham- sì, questa era la mia intenzione, ma l'ho dimenticato mentre scrivevo :-) – jeb