2016-03-14 39 views
0

爲了編寫我一直在玩的遊戲的批處理模擬人生,我最近開始學習批處理。我想知道它是否可能以某種方式迭代像命名變量(因爲我似乎無法找到關於列表的任何內容?)。此外,我不確定是否可以將標籤作爲變量傳遞給調用者。是否有可能從批處理字符串中獲取變量?

代碼示例:

:: Enemy Fortress level. 
SET EFORTLVL=4 

:: Don't mess with anything below here only the variables above. 

:: Enemy Fortress that will be simmmed against. Note this batch sim is only built to run against one tower, as this is what you should be doing. 
SET EFORTRESS1="Foreboding Archway-%EFORTLVL%" 
SET EFORTRESS2="Illuminary Blockade-%EFORTLVL%" 
SET EFORTRESS3="Tesla Coil-%EFORTLVL%" 
SET EFORTRESS4="Minefield-%EFORTLVL%" 
SET EFORTRESS5="Forcefield-%EFORTLVL%" 

call :sim 1 

:sim 
SET /a "COUNTER=1" 
SETLOCAL enabledelayedexpansion 
SET times=!ITERATIONS%1! 
ENDLOCAL & SET TIMES=%times% 
:whilesim 
SETLOCAL enabledelayedexpansion 
SET fort=!EFORTRESS%COUNTER%! 
ENDLOCAL & SET FORT=%fort% 
tuo.exe %DECK0% %ENEMY% surge random -v efort %FORT% yfort %YFORTRESSES% climb %TIMES% >> %PATH%\WarDefClimbData%DECK0%.txt 
SET /a "COUNTER=COUNTER+1" 
if %COUNTER% leq 5 GOTO :whilesim else GOTO :eof 

,我得到了在控制檯上線的結果:

解決: 我想要做的就是保持一個字符串名稱的變量得到的值這涉及到所討論的變量。 (例如,當for循環傳遞1我想獲得EFORTRESS1值,2我想EFORTRESS2值等)。

E:\Programs\Tyrant Unleashed Optimizer>tuo.exe oconzer "VetDecks" surge random -v efort EFORTRESS1 yfort "Inspiring Altar #2" climb ITERATIONS1 1>>"e:\Programs\Tyrant Unleashed Optimizer\BatchSimResults"WarDefClimbDataoconzer.txt 
Error: unrecognized fortress EFORTRESS1 

現在我明白爲什麼它說錯誤,我不明白的是爲什麼它沒有從FORT中包含的字符串中獲取值。

已解決 獲取無限循環,迭代變量未更新。

+1

你能問題縮小到一個,只批問題,陳述投入和期望的產出?此外,顯示你到目前爲止嘗試過的。 – dovetalk

+1

我沒有給你答案,但我建議你看看PowerShell,它比cmd更加程序員友好。 –

+0

這是一個只有批次的問題。我試圖從%FORT%讀取%作爲變量%EFORTRESS1%,%EFORTRESS2%.... 如果我把變量作爲%EFORTRESS1,%EFORTRESS2%....它可以工作,但我「m試圖做一個簡短的函數,所以我不必多次編寫相同的代碼:S –

回答

0
:sim 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "FORT=!EFORTRESS%1!" 
ENDLOCAL&SET "fort=%fort%" 
SET TIMES=ITERATIONS%2 
SET LABEL=%3 

問題是獲取變量的內容(通常稱爲「間接」)的內容。

這可能是最簡單的方法。它使用setlocal enabledelayedexpansion其中cmd位於delayedexpansion模式,其中!var!被評估爲之後其內容。

缺點是它使用setlocal調用必須,它建立了一個本地環境。最終必須關閉loacl環境(無法繼續開放更多),並且當時對環境的所有更改都將被丟棄,並在執行setlocal時恢復到其狀態。

endlocal&...使用解析技巧將更改傳送出setlocal/endlocal括號。

至於其他問題 - 是的,你可以goto一個變量(和變量的內容不需要有一個前導冒號)。例如,使用goto somewhere%1是很有可能的,並且可以按照您的要求提供%1作爲參數。文本somewhere將被簡單地預設爲值%1

順便說一句 - 看來你正在改變path。這是不是一個好主意。 path是包含;分隔的目錄列表的變量,如果該可執行文件被調用且在當前目錄中找不到該可執行文件,那麼這些目錄將搜索可執行文件。最好只留下一個人。這同樣適用於tmptemp(指向到一個臨時目錄)和datetimerandomcd(當前日期,時間,隨機數和當前目錄)

+0

好吧,我已經更新它,讓你的建議像現在這樣的endlocal,現在我遇到了我的for循環沒有更新第一個變量(計數器%G)的問題。它的住址1.:S 就路徑而言,我將它設置爲最頂層的變量,所以我不必保留重新輸入希望結果保存的路徑。像這樣: SET PATH =「e:\ Programs \ Tyrant Unleashed Optimizer \ BatchSimResults」 –

+0

想一想當你到達最終的if時會發生什麼。例程會轉到標籤step1,然後執行什麼操作?這裏有一個線索:'goto:eof'表示'去物理文件結束',這將終止一個子程序。至於'路徑' - 不要說我沒有提醒你...... – Magoo

相關問題