for循环中的if语句无法正常工作
问题描述:
因此,我正在编写一个脚本,可以告诉脚本是否已执行某个操作。我开始使用一个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
值块时开始” -
答
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
也不j
当for
遇到设置被解析为什么因此您的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
提取的值,然后测试即。
如果!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
谢谢你的建议,但你能解释什么“for/F”tokens = 1,2“%%我在(”!我!!j!“)中”意味着什么?我还是新来的批次。我只是试过你的代码,并没有显示它重复多少次 – jacknip
你可以在命令提示符下键入'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