【问题标题】:if-statement in for-loop not workingfor循环中的if语句不起作用
【发布时间】:2017-09-23 03:24:07
【问题描述】:

所以我正在编写一个脚本来判断一个动作是否已经被执行。我从一个包含 0 的 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”有关,但我不知道该怎么做。提前致谢。

【问题讨论】:

  • 您可以使用for /F "tokens=1,2" %%i in ("!i! !j!") do if !map[%%i][%%j]! EQU 0 (set map[%%i][%%j]=1) else ...。这种类型的管理在this post 有完整的描述
  • 感谢您的建议,但您能解释一下“for /F "tokens=1,2" %%i in ("!i! !j!") do”是什么意思吗?我还是批次的新手。我刚试过你的代码,它没有显示它重复了多少次
  • 您可以在命令提示符下键入for /? 并阅读帮助屏幕,或者查看网络中存在的有关for 命令的众多描述中的任何一个,例如this 或@987654323 @, etc... 在这种情况下,它将!i!!j! 的值分配给%%i%%j,因此!map[%%i][%%j]! 可以正确使用。

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


【解决方案1】:
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,因为在遇到 for 时既没有设置 i 也没有设置 j - %var% 表示“当块开始var的值”因此你的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[!!][! 和@987654339 @reulting in if ij equ 0 ... 这显然总是会失败)

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

【讨论】:

  • 非常感谢!我已经坚持了一天,我确实尝试过“if !map[!i!][!j!]! EQU 0 (set map[!i!][!j!]=1) else (echo Repeated )”,但它不起作用。从来不知道我可以将 s 设置为执行此操作的值。
  • 这个答案虽然解决了这个问题,但并不是一个通用的解决方案。即,如果数组具有非数字值,则此方法不起作用...
猜你喜欢
  • 2018-10-19
  • 2018-11-05
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多