所以我正在编写一个脚本,可以判断某个动作是否已经执行过。我从一个带有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”有关,但我不知道该怎么做。提前谢谢。
答案 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 ,因为i
和j
都未设置for
和%var%
遇到1}} - var
表示“阻止启动时if
的值”,因此if !map[][]! EQU 0 ...
已解析为map[][]
- !var!
是有效的varname。
要使用块的操作(即“运行时”值)更改变量的值,您需要使用delayed expansion
和if !map[!i!][!j!]! EQU 0 (set map[!i!][!j!]=1) else (echo Repeated)
操作。这将产生(理论上)
cmd
但是这不起作用,因为!
无法解决首先要解析的!map[!
对(它会选择!][!
,导致!]!
的{{1}}和if ij equ 0 ...
明显总是会失败)
所以 - 我选择将s
设置为从map
中提取的值,然后测试 。