for循环中的if语句不起作用

时间:2017-09-23 03:24:07

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

所以我正在编写一个脚本,可以判断某个动作是否已经执行过。我从一个带有0s的2x2数组开始。我想在四个元素中随机存储三个1,如果元素已经存储1,则重复echo以通知用户。这是我到目前为止的代码,即使多次选择相同的元素,它也不会回显重复。

@echo off
setlocal EnableDelayedExpansion
::::::::::::::::::::::::::::::::::::::::::::Creating a 2x2 zero array
for /l %%y in (0,1,1) do (
    for /l %%x in (0,1,1) do (
        set map[%%x][%%y]=0
    )
)
::::::::::::::::::::::::::::::::::::::::::::Putting 1s in elements randomly
for /l %%x in (1,1,3) do (
    set /a j=!Random!%%2
    set /a i=!Random!%%2
    if !map[%i%][%j%]! EQU 0 (set map[!i!][!j!]=1) else (echo Repeated)
)
::::::::::::::::::::::::::::::::::::::::::::Result
echo !map[0][0]!!map[1][0]!
echo !map[0][1]!!map[1][1]!
echo.
pause

我在网上阅读了相关的内容,我很确定它与“setlocal EnableDelayedExpansion”有关,但我不知道该怎么做。提前谢谢。

1 个答案:

答案 0 :(得分:0)

for /l %%x in (1,1,3) do (
    set /a j=!Random!%%2
    set /a i=!Random!%%2
    SET /a s=map[!i!][!j!]
    if !s! EQU 0 (set map[!i!][!j!]=1) else (echo Repeated)
)

在您的代码中,%i%%j%将分别解析为 nothing ,因为ij都未设置for%var%遇到1}} - var表示“阻止启动if的值”,因此if !map[][]! EQU 0 ...已解析为map[][] - !var!是有效的varname。

要使用块的操作(即“运行时”值)更改变量的值,您需要使用delayed expansionif !map[!i!][!j!]! EQU 0 (set map[!i!][!j!]=1) else (echo Repeated) 操作。这将产生(理论上)

cmd

但是这不起作用,因为!无法解决首先要解析的!map[!对(它会选择!][!,导致!]!的{​​{1}}和if ij equ 0 ...明显总是会失败)

所以 - 我选择将s设置为从map中提取的值,然后测试