首页 > 解决方案 > Windows CMD - 作为数组变量值的代码语句不适用于 IF 命令

问题描述

我想在 Windows 命令中创建一个自动化测试数组,使用单个代码语句作为每个测试数组记录的 VALUE。下面是 $code_test[xx] 数组中前两条记录的数组定义:

set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (echo BUG OFF)

我想使用这样的for /l循环执行每个 $code_test[xx] 数组记录(这是一个测试代码语句)的 VALUE:

for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    !$code_test[0%%g]!
    echo.
)

完整的代码是:

@echo off
setlocal enabledelayedexpansion

set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (echo BUG OFF)

for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    !$code_test[0%%g]!
    echo.
)

echo.
pause

当我执行完整的代码时,我在执行代码行时收到以下错误消息!$code_test[0%%g]!

'if' 不是内部或外部命令、可运行程序或批处理文件

我在这里阅读了关于如何解析 IF 命令的优秀文章,但我没有看到任何关于我的代码失败的原因。甚至有可能做我想要完成的事情吗?

任何帮助表示赞赏!

更新:set当我在代码行中使用命令 时,我发现@sst 是正确set $code_test[01]=if 5 lss 10 (set /a $var1+=1) 的:

@echo off

setlocal enabledelayedexpansion

set $var1=0
set $code_test[00]=if 5 lss 10 (echo IT WORKED)
set $code_test[01]=if 5 lss 10 (set /a $var1+=1)

for /l %%g in (0,1,1) do (
    echo $code_test[0%%g]
    cmd /c !$code_test[0%%g]!
    echo $var1 = !$var1!
    echo.
)

echo.
pause

set /a $var1+=1命令没有按预期增加 $var1 的值。事实上,当代码行echo $var1 = !$var1!执行时,它会在 $var1 标签前面放置一个“1”。我还没有尝试过@Magoo 提供的解决方案。我真的很想使用cmd /c解决方案而不是调用子程序。我可以做些什么来使该set命令与该cmd /c选项一起使用吗?

标签: windowsbatch-filecmd

解决方案


它无法按照您尝试的方式工作,因为在第 2 阶段检测并处理了 IF 命令。
但是延迟扩展为时已晚。
此问题仅发生在命令 IF、FOR 和 REM。

'CALL %%$code_test%%' 在许多情况下都有效,但对于三个命令和代码块也失败了。
目前尚不清楚为什么在这种情况下它会失败,因为命令在第 2 阶段被解析但它们未被识别。

@stephan 的解决方案使用一个新的 cmd 实例,它的缺点是每次 cmd 实例完成时都会丢失所有变量修改。

因此,@Magoo 的解决方案使用了百分比扩展,这几乎在所有情况下都可以正常工作。


推荐阅读