【问题标题】:escape function parameter in batch批量转义函数参数
【发布时间】:2014-06-02 07:28:21
【问题描述】:

我正在开发一个将编译为批处理脚本的 DSL(为了好玩……)。 我正在尝试进行函数调用,如下所示: DSL 使用名为 param1 的参数定义函数。 该批次定义了一个带有 param1=%1 的标签。 DSL 定义了一个具有某些价值的调用。 批处理定义了一个调用,其值位于空格之后。

问题是如果值有空格,它被定义为两个参数。 我可以用 ^ 转义空格,但是如果我尝试转义双引号,它就会搞砸。

谁能帮我解决最终的批处理参数转义?

顺便说一句,它是用 MPS 编写的,如果你想要它就在这里:https://github.com/TheAnosmic/MPSBatch

【问题讨论】:

    标签: windows function batch-file call mps


    【解决方案1】:

    最简单的解决方案是使用双引号来调用您的参数。

    但是,如果这个参数包含一些双引号,它就不起作用。在这种情况下,我们可以基于 eckes 的解决方案来实现一个解决方案:我们可以在函数中做一个循环来读取所有参数并将它们复制到函数的参数中。

    例如,这可能如下所示:

    @echo off
    
    set var=With "" and a space
    call :call_var %var%
    goto:EOF
    
    :call_var
    set param=
    for /F " delims==" %%V in ("%*") do @set param=%param% %%V
    REM Test parameter
    echo %param%
    goto:EOF
    

    【讨论】:

      【解决方案2】:

      我认为没有绝对可靠的方法。批处理解析器真的很丑。例如,如果您有一个带有关闭的变量),则以下回显将中断:

      set VAR=Program Files (x86)
      echo var=%VAR%.
      

      在某些情况下使用 FOR 会有所帮助

      @set VAR=a * b "test" c ()
      @for /F " delims==" %%V in ("%VAR%") do @echo var=%%V.
      

      将打印

      C:\Users>test.cmd
      var=a * b "test" c ().
      

      【讨论】:

      • 这对于脚本来说可能是一个很好的解决方案,但是当我编写“编译器”时,我希望它生成的脚本更漂亮。我不在乎改变它,我可以用变量写一些逻辑,必须有一种方法来产生安全和漂亮的代码。
      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2017-05-20
      • 2016-03-08
      • 2019-11-12
      相关资源
      最近更新 更多