2012-03-28 5 views
5

Tengo un archivo por lotes ventanas que acepte una contraseña de usuario como entrada:escape de entrada del usuario en el archivo por lotes ventanas

SET /P PASSWORD=Password: 

Esta contraseña puede tener caracteres que necesitan escapan como !. La variable PASSWORD luego se pasó a otros archivos por lotes utilizando CALL

CALL Foo.Bat %PASSWORD% 

¿Cómo puedo asegurar que los caracteres especiales consiguen escaparon y se pasan correctamente como parámetro? Por ejemplo, si el usuario ingresa !%"£$" quiero que %1 sea !%"£$" en Foo.bat.

Respuesta

2

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

Gracias, que resuelve el problema :). – briantyler

+0

O '¡Echo!% ~ 1!' Dado que el nombre de la variable se pasó como parámetro. – dbenham

+0

@ dbenham- Sí, esa era mi intención, pero lo olvidé mientras escribía :-) – jeb

Cuestiones relacionadas