【问题标题】:Comparison operator substitution for IF from FOR cycle in batch scripts批处理脚本中 FOR 循环中 IF 的比较运算符替换
【发布时间】:2013-01-19 04:33:05
【问题描述】:

我想在一个可能很简单的情况下(我还不清楚解决方案)寻求您的帮助。

我正在尝试为 if 命令提供一个变量,以使代码更加“动态”,但这对我来说失败了: % 在此时出乎意料。

这是一个简单的例子:

> for %i in (NEQ) do (if 1 %i 2 echo jo)
%i was unexpected at this time.

虽然以下内容很像魅力:

>set oper=NEQ
>for %i in (NEQ) do (if 1 %oper% 2 echo works)
works

由于我应该留在 for 循环中(并且我从实际代码中的 for 循环中获取实际运算符),我真的很困惑如何解决它......

也尝试使用 EnableDelayedExpansion,但是 !variable!而不是运营商也被拒绝。有没有办法在 IF 的 FOR 循环中提交变量,而无需对脚本进行重大修改?

【问题讨论】:

    标签: if-statement for-loop batch-file


    【解决方案1】:

    有没有办法在 IF 的 FOR 循环中提交变量?

    不! 因为,IF 语句有它自己的解析器,它期望在这个解析阶段已经扩展了一些标记。
    所以既不能扩展选项,也不能扩展运算符,也不能扩展NOT
    但允许使用延迟变量或 FOR 变量扩展值。

    setlocal EnableDelayedExpansion
    set myOperator=EQU
    IF 1 %myOperator% 1 echo Works
    IF 1 !myOperator! 1 echo FAILS
    for %%O in (EQU) do IF 1 %%O 1 echo Works
    

    百分比扩展有效,因为它在IF 解析器得到该行之前被扩展。

    如果你真的需要使用变量运算符,那么你需要使用一个函数。

    for %%O in (EQU) do call :myFunc %%O
    exit /b
    
    :myFunc 
    IF ONE %1 ONE echo Works
    exit /b
    

    编辑:
    并且特殊的解析器也是原因,这里不可能为IF 语句使用CALL 扩展。

    喜欢这个主意

    set myOperator=EQU
    CALL IF 1 %%myOperator%% 1 echo Works
    

    这应该扩展到IF 1 EQU 1 echo Works,但CALLIF 的组合总是失败。

    【讨论】:

    • 感谢您提供的信息,我不知道。我将尝试使用建议的功能方法,再次感谢您。 (不确定第一个代码是否有效,对我来说它在第 4 行失败,并且无法继续到第 5 行。如果我 REM 出第 4 行,第 5 行失败。)
    • 是的,第 4 行和第 5 行不起作用,因为两者都会产生语法错误。 IF 解析器不能处理 !myOperator!%%O 所以它会抛出错误。
    • 为了不大幅改动原始代码(我分享的代码是对原始代码的简化,只是为了说明我的问题),我已对其进行了修改以使用另一个 FOR 命令。例如,它类似于:for %i in (NEQ) do ( for /F %x in ('if 1 %i 2 echo works') do (echo works) )
    • for /f %x in 'if 1 %i 2 echo works') ...的情况下它可以工作,因为在解析if之前会发生%i的扩展,因为完整的if %i 2 echo ...是在一个新的cmd线程中执行的
    猜你喜欢
    • 2013-06-26
    • 2016-06-04
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2017-02-03
    • 2023-03-06
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多