在Windows批处理文件中转义用户输入

时间:2012-03-28 15:04:41

标签: batch-file cmd

我有一个Windows批处理文件,它接受一个密码作为用户输入:

SET /P PASSWORD=Password:

此密码可能包含需要转发的字符!。然后使用PASSWORD

CALL变量传递给其他批处理文件
CALL Foo.Bat %PASSWORD%

如何确保特殊字符作为参数进行转义和正确传递?例如,如果用户在!%"£$"输入%1我希望!%"£$"Foo.bat

1 个答案:

答案 0 :(得分:2)

这是一个很好的挑战,但这是先进的批量技术 我会在这里使用更简单的方法,使用延迟扩展而不发送内容,只发送变量名称。

即使使用特殊字符,这也绝对安全。

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

要在ShowParam.bat中查看真实的参数,我使用类似的东西 ShowParam.bat

@echo off
setlocal
set prompt=
@echo on
REM # %* #