Batch file 转义windows批处理文件中的用户输入
我有一个windows批处理文件,它接受密码作为用户输入:Batch file 转义windows批处理文件中的用户输入,batch-file,cmd,Batch File,Cmd,我有一个windows批处理文件,它接受密码作为用户输入: SET /P PASSWORD=Password: 此密码可能包含需要转义的字符,如。然后使用CALL将PASSWORD变量传递给其他批处理文件 CALL Foo.Bat %PASSWORD% 如何确保特殊字符被转义并作为参数正确传递?例如,如果用户输入!%“£$”我想%1成为!%“£$”在Foo.bat这是一个很好的挑战,但这是先进的批量技术。 这里我将使用一种更简单的方法,使用延迟扩展,不发送内容,只发送变量名 即使使用特殊字符
SET /P PASSWORD=Password:
此密码可能包含需要转义的字符,如代码>。然后使用CALL将PASSWORD
变量传递给其他批处理文件
CALL Foo.Bat %PASSWORD%
如何确保特殊字符被转义并作为参数正确传递?例如,如果用户输入!%“£$”
我想%1
成为!%“£$”
在Foo.bat
这是一个很好的挑战,但这是先进的批量技术。
这里我将使用一种更简单的方法,使用延迟扩展,不发送内容,只发送变量名
即使使用特殊字符,这也是绝对安全的
call foo.bat password
食蝠-----------------
Setlocal EnableDelayedExpansion
Echo !password!
编辑:原始问题的解决方案,
这是一种用内容而不是变量名来解决问题的方法
在通过调用将内容发送到第二批文件之前,需要准备内容。
很难使用调用foo.bat%preparedVariable%
使用调用foo.bat似乎更好!准备变量代码>
但即便如此,在呼叫阶段,我也无法将插入符号加倍
@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
但后来我找到了一个简单的方法,在呼叫阶段之后使用百分比扩展
@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
或Echo!%~1!代码>因为变量的名称是作为参数传递的。@dbenham-是的,这是我的意图,但我在写时忘记了:-)@dbenham,Aacini,Joey,PA。还有另一位专业人士:有可能按照OP的第一个要求解决它吗?@jeb-这是一个棘手的问题(如你所知)。如果允许直接调用和通过调用(甚至多次调用)调用目标批,则很难完全解决此问题—您必须知道要应用的转义数。然后是引用的插入符号加倍,然后是延迟扩展启用或禁用的可能性,无论有无代码>在内容中。在我看来不值得这么努力。我曾经有一个可调用批处理函数的脚本,它试图使用文字字符串参数——这真是一场噩梦。我很久以前就放弃了这项工作。@jeb:唯一的方法是在传递给子例程之前,通过插入插入插入符号、加倍百分比等来准备变量值。这有太多的特殊情况,得到的结果没有什么价值。正如戴夫所说:这不值得付出努力。。。