2015-04-29 52 views
0

我想批量啓動一些實驗。 我需要重做一些但不是全部。 其中(s == 1000和r == 0.5和(c == 1或c == 25或c == 75))已經完成的那些可以被跳過(它們需要很長時間才能運行)。 自從我引入IF語句以來,括號被解析的方式就是給出錯誤。我一直在意料之中(或)。 我試過重寫整個事情,但無濟於事。批處理文件與IF語句和隱祕問題

我知道這很像'請檢查我的代碼錯誤'的問題,但我真的在我的智慧在這裏結束。

SET dotest=1 
FOR %%s IN (1000,2000) do (
    FOR %%r IN (0.5,0.75,1) do (
     FOR %%c IN (1,25,75,100) do (
      IF (%%s==1000) (
       IF (%%r==0.5) (
        IF (%%c==1) 
         (SET dotest==0) 
        IF (%%c==25) 
         (SET dotest==0) 
        IF (%%c==75) 
         (SET dotest==0) 
       ) 
      ) 
      IF (%%dotest==1) (
       ECHO "Hello World!" 
      ) 
     ) 
    ) 
) 
+2

首先,你應該閱讀的正確語法的幫助下,鍵入'IF /?'在控制檯。由於語法錯誤比代碼 – jeb

+2

多,所以'cmd /?'需要延遲擴展,因爲'dotest'在括號內改變它的值。 – npocmaka

+3

'set'只使用一個等號。 – Stephan

回答

4
@echo off 

setlocal enableDelayedExpansion 
FOR %%s IN (1000,2000) do (
    FOR %%r IN (0.5,0.75,1) do (
     FOR %%c IN (1,25,75,100) do (
      SET dotest=1 
      IF %%s == 1000 (
       IF %%r == 0.5 (
        IF %%c == 1 (
         SET dotest=0 
        ) 
        IF %%c==25 (
         SET dotest=0 
        ) 
        IF %%c==75 (
         SET dotest=0 
        ) 
       ) 
      ) 
      IF !dotest! == 1 (
       ECHO "Hello World^!" %%s,%%r,%%c 
      ) 
     ) 
    ) 
) 

你應該能夠不用語法錯誤,運行此 - 但沒有辦法,我知道,如果邏輯是你的榜樣correct.The問題:

  1. IF條件無括號定義
  2. 啓動,如果在同一行
  3. 如果在此再次改變括號內的值dotest和需要括號的內容後,你需要推遲擴張和!代替括號上下文
  4. SET命令只使用一個等號
+1

而計數FOR循環需要一個參數'/ L'並且只能計算整數而不是分數。你忘了'setlocal Enabel ...' – jeb

+0

@jeb - 謝謝。我不確定'FOR/L' - OP可能需要迭代。無論如何,這裏使用的是雙數,這是行不通的。 – npocmaka

+2

@jeb:沒關係。試試'FOR%r IN(0.5,0.75,1)做@echo%r' – Stephan

2

IF的語法是IF x==y (...)而不是IF (x==y) (...)。沒有()周圍的條件!此外,您必須在腳本和地址的開頭添加Setlocal EnableDelayedExpansion,以代替!dotest!而不是%dotest%

+0

tx,我實際上只是因爲括號錯誤而在嘗試的東西 – Gullydwarf

1

你可以試試看

 for %%s in (1000, 2000 
) do for %%r in (0.5, 0.75, 1 
) do for %%c in (1, 25, 75, 100 
) do (
    set "doTest=1" 
    if %%s==1000 if %%r==0.5 if not %%c==100 set "doTest=" 
    if defined doTest (
     echo "Hello World!" 
    ) 
) 

所有不需要的括號,並從代碼中刪除檢查,同時保持邏輯無論是在問題暴露和原始代碼。在這種情況下,由於變量僅用作開關,而不是測試內部值(可能需要延遲擴展),如果測試變量是定義(有值)還是未定義(沒有值)

編輯一個更常用的代碼格式

for %%s in (1000, 2000) do for %%r in (0.5, 0.75, 1) do for %%c in (1, 25, 75, 100) do (
    set "doTest=1" 
    IF %%s==1000 if %%r=0.5 if not %%c==100 set "doTest=" 
    IF defined doTest (
     echo "Hello World!" 
    ) 
) 
+1

短和工程(可能如預期),但格式有點討厭 – jeb

+0

@jeb,這是不尋常的,但對於所有代碼放在內部的'for'命令,我發現這更容易閱讀並遵循邏輯,至少在發佈的代碼中。但我不得不承認,我並沒有在真實的代碼中使用它。 –