作者tsaiminghan (nahgnimiast)
看板EZsoft
標題[請問] 批次檔的延遲變數
時間Thu Aug 12 00:49:31 2010
我利用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
→ hpo14:echo !AAA! 試看看 08/12 01:34
→ tsaiminghan:case2中沒有用延遲變數,所以不會認得!AAA! 08/12 02:00
→ tsaiminghan:case3用了延遲變數,但是return的值沒辦法保住 08/12 02:00
→ tsaiminghan:我自已試的結果,如果沒開延遲變數的功能 08/12 02:01
→ tsaiminghan:!AAA!是不會被當成變數的 08/12 02:02