[請問] 批次檔的延遲變數

看板EZsoft (小軟體)作者 (nahgnimiast)時間15年前 (2010/08/12 00:49), 編輯推噓0(005)
留言5則, 2人參與, 最新討論串1/1
我利用call :label的方式寫了一個河內塔的遞迴函式 第一個版本是ok的 ================第一個版本=========================== @echo off set return= set /p n=請輸入河內塔n的數目: call :sub1 %n% echo 要移動%return%次 pause goto :eof REM //================== REM // 河內塔1 REM //================== :sub1 if "%1"=="1" ( set return=1 goto :eof ) set /a temp=%1-1 call :sub1 %temp% set /a return=1+2*return goto :eof ================================================== 後來改寫河內塔的函式,但是這個好像有延遲變數的問題 在set /a AAA=%1-1 這行得到的AAA是空字串(見紅色的部分) 我想請問為什這裡得到的會是空字串(輸出AAA=)? REM //================== REM // 河內塔2 REM //================== :sub2 if "%1"=="1" ( set return=1 ) ELSE ( set /a AAA=%1-1 echo AAA=%AAA% call :sub2 %AAA% set /a return=1+2*return ) goto :eof 因為二版有遲延變數的問題,所以打開遲延變數 但是這個版本在執行到紅色這行之後, 會出現missing operand的錯誤訊息,return的值會 變成空的,不知道有沒有人可以說明一下這個錯誤 發生的原因。 REM //================== REM // 河內塔3 REM //================== :sub2 setlocal enabledelayedexpansion if "%1"=="1" ( set return=1 ) ELSE ( set /a AAA=%1-1 call :sub2 !AAA! set /a return=1+2*!return! ) endlocal goto :eof -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.130.84

08/12 01:34, , 1F
echo !AAA! 試看看
08/12 01:34, 1F

08/12 02:00, , 2F
case2中沒有用延遲變數,所以不會認得!AAA!
08/12 02:00, 2F

08/12 02:00, , 3F
case3用了延遲變數,但是return的值沒辦法保住
08/12 02:00, 3F

08/12 02:01, , 4F
我自已試的結果,如果沒開延遲變數的功能
08/12 02:01, 4F

08/12 02:02, , 5F
!AAA!是不會被當成變數的
08/12 02:02, 5F
文章代碼(AID): #1COjIUJe (EZsoft)
文章代碼(AID): #1COjIUJe (EZsoft)