Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows CMD-代码语句作为数组变量的值不适用于IF命令_Windows_Batch File_Cmd - Fatal编程技术网

Windows CMD-代码语句作为数组变量的值不适用于IF命令

Windows CMD-代码语句作为数组变量的值不适用于IF命令,windows,batch-file,cmd,Windows,Batch File,Cmd,我想在Windows命令中创建一个自动测试数组,使用单个代码语句作为每个测试数组记录的值。下面是$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\u test[xx]数组记录(这是一个测试代码语句)的值,如下所示: for /l %%g in (0,1,1)

我想在Windows命令中创建一个自动测试数组,使用单个代码语句作为每个测试数组记录的值。下面是$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\u test[xx]数组记录(这是一个测试代码语句)的值,如下所示:

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
当我执行完整的代码时,当<代码>$代码测试[0%%g]执行代码行:

“如果”未被识别为内部或外部命令,可操作 程序或批处理文件

我读过一篇关于IF命令是如何解析的优秀文章,但是我没有看到任何关于我的代码失败原因的文章。甚至有可能完成我想要完成的事情吗

感谢您的帮助

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

@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标签前面放置一个“1”$var1执行。我还没有尝试@Magoo提供的解决方案。我确实希望使用
cmd/c
解决方案,而不是调用子例程。我能做些什么使
set
命令与
cmd/c
选项一起工作吗?

您似乎需要另一层解析:

@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]
    cmd /c !$code_test[0%%g]!
    echo.
)
编辑(为了完整):
找到了另一种方法(无子例程):

诀窍是:
for
在一个单独的
cmd
进程(如
cmd/c…
)中执行
(“…”)
部分,但将输出捕获到主进程中

可与
一起使用$代码测试[0%%g]
%%$code\u测试[0%%g]%

虽然如果5个lss 10(set result=it WORKED),它不适用于
,因为没有要捕获的输出(
set
仅使用
do
子句完成)

@echo关闭
延迟扩展
设置$code_test[00]=如果5个lss 10(回显有效)
设置$code_test[01]=如果5 lss 10(回声错误关闭)
对于/l%%g in(0,1,1)do(
设置“$code\u test=!$code\u test[0%%g]!
调用:测试代码
回声。
)
回声。
后藤:EOF
:测试代码
%$code_测试%
后藤:eof

另一种方法。

它无法以您尝试的方式工作,因为在第2阶段检测并处理IF命令。
但由于扩张延迟,一切都为时已晚。
此问题仅适用于IF、for和REM命令

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

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


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

这正是我所需要的!感谢@Stephan帮助我解决这个问题。出于好奇,@Stephan,为什么不使用“call%%”语句呢$代码测试[0%%g]!%“工作(我尝试过)?为什么我必须启动一个新的cmd实例?@BillVallance,请注意,虽然这适用于您的特定情况,但可能并不总是像您预期的那样工作。例如
set$code\u test[00]=如果5 lss 10(set foo=bar)
可能会让你大吃一惊。将命令交给child cmd有其自身的后果,这取决于上下文。对于这一点,你可能想仔细看看@Magoo的答案,如果你还没有找到答案的话。谢谢@sst提供的信息。正如我在尝试时发现的那样,你是绝对正确的在我的代码中使用
set
命令。我已经用新代码更新了我的问题。有人知道我做错了什么吗?
set
命令有效,但当cmd实例关闭时(每次命令后)变量丢失。@Magoo的答案解决了这个问题。为什么
CALL%%!$code…
不起作用,有点不清楚,请参阅我的AnserTanks@jeb来解释这一点。这确实有助于拓宽我的Windows.cmd知识。谢谢@Magoo的回答。它非常有效,即使是
set
命令。对于那些需要完整解释的人关于为什么选择这篇文章作为答案,请看下面的文章。
@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]
    for /f "delims=" %%a in ('%%$code_test[0%%g]%%') do @set "result=%%a"
    echo !result!
    echo.
)