Batch file 转义windows批处理文件中的用户输入

Batch file 转义windows批处理文件中的用户输入,batch-file,cmd,Batch File,Cmd,我有一个windows批处理文件,它接受密码作为用户输入: SET /P PASSWORD=Password: 此密码可能包含需要转义的字符,如。然后使用CALL将PASSWORD变量传递给其他批处理文件 CALL Foo.Bat %PASSWORD% 如何确保特殊字符被转义并作为参数正确传递?例如,如果用户输入!%“£$”我想%1成为!%“£$”在Foo.bat这是一个很好的挑战,但这是先进的批量技术。 这里我将使用一种更简单的方法,使用延迟扩展,不发送内容,只发送变量名 即使使用特殊字符

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

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:唯一的方法是在传递给子例程之前,通过插入插入插入符号、加倍百分比等来准备变量值。这有太多的特殊情况,得到的结果没有什么价值。正如戴夫所说:这不值得付出努力。。。