2017-09-23 6 views
0

私は、アクションが既に実行されているかどうかを確認できるスクリプトを作成しています。私は0で2x2の配列で始めました。私は4つの要素の中に3つの1をランダムに格納したいとし、要素がすでに1を格納している場合は、echoを繰り返してユーザーに通知します。これは私がこれまで持っているコードであり、エコーはしません同じ要素が複数回選択されても繰り返します。for-loop内の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%の意味 - あなたのコード、%i%%j%

+0

!for [%% i] [%% j]!なら、for/Fを使うことができますtokens = 1,2 "%% i in("!i!!j! ") EQU 0(セットマップ[%% 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"トークン= 1,2 "%% i("!i!!j! ")do"の意味を説明できますか?私はまだバッチを初めて使う人です。私はちょうどあなたのコードを試してみましたが、それは何回繰り返されたのかを示していませんでした – jacknip

+0

コマンドプロンプトで 'for /?'とタイプしてヘルプ画面を読んだり、 'for'コマンドに関する多くの記述[this](https://ss64.com/nt/for_f.html)や[this](https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs)のようにWebに存在します。 /en-us/ntcmds_shelloverview.mspx?mfr=true)、etc ...この場合、 '!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) 
) 

はそれぞれijforに遭遇したときに設定されているでもないので、に解決されますしたがって、ifif !map[][]! EQU 0 ...に解決されました。map[][]は有効なvarnameです。

それは(すなわち、「実行時」値)ブロックの操作によって変化するように、可変の値にアクセスするには、操作にdelayed expansion!var!を使用する必要があります。これはif ij equ 0 ...!のペアが最初に解決するためにどの解決するcmdための方法がないので、(それは!map[!!][!!]! reultingを選択します、これは動作しません(理論上は)

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

しかしをもたらすであろう明らかにいつも)

を失敗します - 私はmapから抽出された値にsを設定し、ことをテストすることにしました。

+0

ありがとう!私はこの日にこんなことをしていましたが、 "if!![!i!] [!j!]!EQU 0(set map [!i!] [!j!] = 1)else(echo Repeated ) "それは動作しません。私はそれをする価値にsを設定できることを決して知らなかった。 – jacknip

+0

この回答はこの問題を解決しますが、一般的な解決策ではありません。配列に数値以外の値がある場合、このメソッドは機能しません。 – Aacini

関連する問題