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

bri*_*ler 5 cmd batch-file

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

SET /P PASSWORD=Password:
Run Code Online (Sandbox Code Playgroud)

此密码可能包含需要转义的字符!.PASSWORD然后使用变量将变量传递给其他批处理文件CALL

CALL Foo.Bat %PASSWORD%
Run Code Online (Sandbox Code Playgroud)

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

jeb*_*jeb 3

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

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

call foo.bat password
Run Code Online (Sandbox Code Playgroud)

Foo.bat -----------------

Setlocal EnableDelayedExpansion
Echo !password!
Run Code Online (Sandbox Code Playgroud)

编辑:原始问题的解决方案,
这是用内容而不是变量名来解决它的方法

在通过 CALL 将其发送到第二个批处理文件之前,有必要准备好内容。
很难使用类似的东西CALL foo.bat %preparedVariable%
It's 似乎更好用CALL foo.bat !preparedVariable!
But 即使如此,我在 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
Run Code Online (Sandbox Code Playgroud)

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

@echo off
setlocal
set prompt=
@echo on
REM # %* #
Run Code Online (Sandbox Code Playgroud)