2014-01-28 93 views
0
if %CHO%==1 (
    set cost=35 
    if %GP% GEQ %cost% (
     echo Do want to replace %WEP% with Broadsword? 
     set /p CHO= 
     if %CHO%==yes (
      set /a GP=%GP%-35 
      set WEP=Broadsword 
      goto weapon 
     ) 
     if %CHO%==Yes (
      set /a GP=%GP%-35 
      set WEP=Broadsword 
      goto weapon 
     ) 
     if %CHO%==no goto weapon 
     if %CHO%==No goto weapon 
    ) 
    if %GP% LSS %cost% (
     echo You don't have enough GP! 
     pause 
     goto weapon 
    ) 
) 

每當我運行這段代碼時,cmd都說這個命令的語法不正確並且關閉。我認爲嵌套內的嵌套是批量允許的。有什麼我做錯了嗎?批量嵌套代碼不正確?

+0

你在.cmd文件中寫遊戲嗎?你是否考慮過其他語言?無論如何,你需要提供更多信息......它在哪裏失敗? – tenfour

+0

我實際上是使用多個cmd文件相互調用並編輯對方以「保存」您的進度。我決定從頭開始製作一款遊戲,不使用任何程序。 –

+0

它被寫入一個.bat文件。只要我輸入1並運行此代碼,就會出錯。 –

回答

1

整個IF構造被解析爲一個塊,並且所有變量在開始時只被評估一次。

您可以重新排列你的代碼沒有循環和變量在其中,否則你將不得不使用SETLOCAL ENABLEDDELAYEDEXPANSION和使用!cost!而不是%cost%(例如)爲設置您的循環結構中的任何變量。

0

這應該在功能上與您的代碼相同。
它在循環中創建的變量上使用延遲擴展。

@echo off 
setlocal EnableDelayedExpansion 

if "%CHO%"=="1" (
    set cost=35 
    if %GP% GEQ !%cost! (
     echo Do want to replace %WEP% with Broadsword? 
     set /p CHO= 
     if /i "!CHO!"=="yes" (
      set /a GP=%GP%-35 
      set WEP=Broadsword 
     ) else (
      echo You don't have enough GP! 
      pause 
     ) 
    ) 
goto weapon 
) 

注意/i中的if比較使得比較大小寫不敏感。
此外,圍繞比較術語的引號將阻止簡單的輸入按鍵破壞您的代碼。它允許使用兩個詞語也可以使用。

+0

謝謝!我能夠修復它。實際上,我發現setlocal EnableDelayedExpansion並不是必需的,只要在嵌套代碼中設置變量周圍的感嘆號,代碼就可以正常運行。 –

+0

它必須已經啓用延遲擴展。很高興你修好了它。 – foxidrive