【问题标题】:Fix a batch script to handle closing parentheses inside an if block修复批处理脚本以处理 if 块内的右括号
【发布时间】:2019-11-27 09:14:55
【问题描述】:

我有一个批处理脚本可以在不同的环境下运行不同的PHP版本。

@ECHO OFF
setlocal EnableExtensions EnableDelayedExpansion
IF "%ANSICON%" == "" (
  php7 %*
) ELSE (
  php5 %*
)

问题在于它在第一个未转义的右括号处中断,因为它与 IF "%ANSICON%" == "" ( 中的左括号匹配。

C:\>php -r echo'()';
' was unexpected at this time.

C:\>php -r echo'(())';
)' was unexpected at this time.

setlocal EnableExtensions EnableDelayedExpansion 行是基于我阅读的其他问题的新行,但它根本没有改变行为。

我怎样才能将所有的%* 传递给 PHP 而不先被批处理解释?

此批处理文件表现出相同的行为:

@ECHO OFF
setlocal EnableExtensions EnableDelayedExpansion
IF "%ANSICON%" == "" (
  echo %*
) ELSE (
  echo %*
)

【问题讨论】:

    标签: batch-file escaping delayedvariableexpansion


    【解决方案1】:

    您可以使用延迟扩展的临时变量,那么括号不会引起问题。

    @ECHO OFF
    setlocal EnableDelayedExpansion
    set "args=%*"
    IF "%ANSICON%" == "" (
      php7 !args!
    ) ELSE (
      php5 !args!
    )
    

    或者你可以使用函数。

    @ECHO OFF
    IF "%ANSICON%" == "" (
      goto :php7_exec
    ) ELSE (
      goto :php5_exec
    )
    exit /b
    
    :php5_exec
    php5 %*
    exit /b
    
    :php7_exec
    php5 %*
    exit /b
    

    【讨论】:

    • 我还需要setlocal EnableExtensions EnableDelayedExpansion吗?除了“修复”东西之外,我真的不明白它的作用。第一个在没有EnableExtensions 的情况下工作。
    • @CJDennis setlocal EnableDelayedExpansion 启用附加语法!variable! 来扩展变量,而不是使用%variable%。主要区别在于,扩展是在执行时而不是解析时完成的,并且在使用延迟扩展时,所有特殊字符都是无害的! EnableExtensions 几乎总是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2022-01-18
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多