【问题标题】:Passing arguments with special characters to batch script while delayedexpansion enabled在启用延迟扩展时将带有特殊字符的参数传递给批处理脚本
【发布时间】:2020-08-05 01:57:51
【问题描述】:

我需要调用一个接受密码作为其参数之一的脚本。每当密码包含, 时,它都被视为分隔符,密码将被拆分为两个参数,当它包含! 时,所有特殊字符都将被省略。我已经尝试将它们包含在'" 中并预处理密码以使用^^^ 进行转义。不幸的是,没有任何效果。如何在密码中保留这些特殊字符?

【问题讨论】:

    标签: windows batch-file cmd command-line-arguments delayedvariableexpansion


    【解决方案1】:

    您是对的,延迟扩展必须(暂时)关闭才能正常工作。 ! 必须转义(稍后用于延迟的部分)并引用处理其余部分:

    @echo off
    setlocal enabledelayedexpansion
    
    REM --- get parameter ---
    setlocal disabledelayedexpansion
    set "x=%~1"
    endlocal & set "x=%x:!=^!%"
    REM --- end get param ---
    
    set x
    echo "!x!"
    

    输出:

    C:\TEST>test.bat "pass,!<& %|>word"
    x=pass,!<& %|>word
    "pass,!<& %|>word"
    

    主要技巧是endlocal &amp; set "x=%x:!=^!%" 这一行。 set 命令仍然解析,没有延迟扩展,但在endlocal 之后执行(因为整行在执行任何操作之前都会被解析 - 是的,奇怪的事情.. .)

    【讨论】:

    • @aschipfl 是和否 - 取决于它相对于其他毒字符的位置(它们在哪里)。 (我想我记得一个防弹方法(我想是 dbenham 的),但现在找不到它——据我所知,那是更多的代码)
    • 我猜它使用了内置变量CmdCmdLine,可以通过延迟扩展来访问它,但是你必须自己做参数分离......跨度>
    • @aschipfl 哦,^ 是另一个麻烦的候选人。
    • 啊,我想是因为延迟扩展?
    • @aschipfl 这只是事实的一半。 set 也将其视为转义字符并抑制它。
    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多