【问题标题】:Escape user input in windows batch file在 Windows 批处理文件中转义用户输入
【发布时间】:2012-03-28 15:04:40
【问题描述】:

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

SET /P PASSWORD=Password:

此密码可能包含需要转义的字符,例如 !。然后使用CALLPASSWORD 变量传递给其他批处理文件

CALL Foo.Bat %PASSWORD%

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

【问题讨论】:

    标签: batch-file cmd


    【解决方案1】:

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

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

    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 中的 real 参数,我使用类似这样的东西
    ShowParam.bat

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

    【讨论】:

    • Echo !%~1!,因为变量名是作为参数传递的。
    • @dbenham- 是的,这是我的意图,但我在写的时候忘记了 :-)
    • @dbenham, Aacini, Joey, PA。和其他 pro's:是否可以按照 OP 首先要求的方式解决它?
    • @jeb - 这是一个令人讨厌的问题(如您所知)。如果您允许直接和通过 CALL(甚至多个 CALL)调用目标批处理,则很难完美解决 - 您必须知道要应用的转义数。然后引用的插入符号加倍,然后可能会启用或禁用延迟扩展,无论内容中有或没有!。在我的脑海中不值得努力。我曾经有一个尝试使用文字字符串参数的可调用批处理函数脚本——这是一场噩梦。我很久以前就放弃了。
    • @jeb:唯一的方法是在传递给子例程之前通过插入插入符号、加倍百分比等来准备变量值。这有太多的特殊情况,得到的结果价值不大。正如戴夫所说:这不值得努力......
    猜你喜欢
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多