2017-09-23 342 views
0

因此,我正在编写一个脚本,可以告诉脚本是否已执行某个操作。我开始使用一个0的2x2数组。我想在这四个元素中随机存储三个1,如果元素已经存储1,则echo重复通知用户。这是迄今为止的代码,即使多次选择相同的元素,它也不会重复重复。for循环中的if语句无法正常工作

@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”的事情,但我不知道该怎么做。提前致谢。 %var%的意思是“var值块时开始” -

+0

如果!map [%% i] [%% j],您可以使用'for/F“标记= 1,2”%%我在(“!i!!j!”)中! EQU 0(set map [%% i] [%% j] = 1)else ...'。这种管理类型在[本文]中有详细描述(https://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990 #10167990) – Aacini

+0

谢谢你的建议,但你能解释什么“for/F”tokens = 1,2“%%我在(”!我!!j!“)中”意味着什么?我还是新来的批次。我只是试过你的代码,并没有显示它重复多少次 – jacknip

+0

你可以在命令提示符下键入'for /?'并阅读帮助屏幕,或者查看关于'for'命令的许多描述中的任何一个存在于网络中,如[this](https://ss64.com/nt/for_f.html)或[this](https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs /en-us/ntcmds_shelloverview.mspx?mfr=true)等等......在这种情况下,它将'!i!'和'!j!'的值赋给'%% i'和'%% j' ,所以'!map [%% i] [%% j]!'可以正确使用。 – Aacini

回答

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%将分别因为无论i也不jfor遇到设置被解析为什么因此您的if已解析为if !map[][]! EQU 0 ... - map[][]是有效的varname。

为了访问可变的价值,因为它与块的操作(即“运行时”值)更改时,需要在操作使用!var!delayed expansion。这将产生(理论上)

if !map[!i!][!j!]! EQU 0 (set map[!i!][!j!]=1) else (echo Repeated) 

这是不行的,因为没有办法为cmd解决这对!先解决(它会选择!map[!!][!!]! reulting在if ij equ 0 ...其中显然总是失败)

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

+0

非常感谢!我一直坚持这一天,我尝试了“if!map [!i!] [!j!]!EQU 0(set map [!i!] [!j!] = 1)else(echo Repeated )“,它不起作用。从来不知道我可以为此付出代价。 – jacknip

+0

虽然这个答案解决了这个问题,但这不是一个通用的解决方案。即如果数组具有非数字值,则此方法不起作用... – Aacini