2013-07-09 64 views
0

我有一個腳本文件,它需要一個介於1和5之間的數字,然後必須將該輸入映射到另一個數字以提供給程序。非常簡單:如果它小於或等於2,則減一個。更高,添加一個。批處理:從輸入讀取數字的加法和減法

這裏是我的腳本的業務部分:

set /p reason=Reason code: 

if %reason%==q (
    goto eof 
) 
if %reason% GEQ 1 (
    if %reason% LEQ 5 (
     if %reason% LEQ 2 (
      set /a code=%reason%-1 
     ) else (
      set /a code=%reason%+1 
     ) 
    echo %code% 
    ) 
) 

我有這個打算與後藤一環。第一次迭代,按1.它說回聲關閉。如預期的那樣再次按1,並且它等於零。按2,它說一個。 2再次,它說1,如預期。

我已經確認它始終如一地表示它應該從最後一個循環輸入什麼(如果是第一個循環,則沒有任何輸入)。每次按'q'鍵退出。

在正確的地方迴響,我確認它符合條件就好。這也是理由很好。它看起來沒有問題,因爲所有的條件都按預期工作(所以如果我按5,然後6,就會阻止6,而不是認爲我給了它5)。

我有另一個腳本具有相同的算術運算,並且工作正常。除了變量的名稱之外,我看不到其他行之間的區別(我之前將其設置回原因變量,但爲了清晰起見更改爲代碼)。

+0

您確定您發佈的代碼完全相同嗎?你確定在「1」時測試用例是否失敗:「echo is OFF」? –

回答

2

該問題是由您使用%變量引起的。這些變量在解析時被擴展,即當解釋器讀取指令時。條件被讀取爲一條指令,因此當正在讀取if %reason% GEQ 1 (...)時,%code%正在擴展。此時,內部條件中的分配尚未完成,因此%code%仍爲空(直到條件處理完成後)。這就是爲什麼你在第一次迭代之後得到ECHO is off,並且每次之後都有一個值(你實際上看到了最後一次迭代的代碼)。

啓用延遲擴展和使用!變量語法條件內code變量:

setlocal EnableDelayedExpansion 

set /p "reason=Reason code: " 

if "%reason%"=="q" goto :eof 

if %reason% GEQ 1 (
    if %reason% LEQ 5 (
    if %reason% LEQ 2 (
     set /a "code=%reason%-1" 
    ) else (
     set /a "code=%reason%+1" 
    ) 
    echo !code! 
) 
) 

如果你不想!code!變得比5你需要修復你的邏輯更大,不過,如像這樣:

if %reason% GEQ 1 (
    if %reason% LEQ 5 (
    if %reason% LEQ 2 (
     set /a "code=%reason%-1" 
    ) else if %reason% EQU 5 (
     set "code=%reason%" 
    ) else (
     set /a "code=%reason%+1" 
    ) 
    echo !code! 
) 
) 

另外,你需要goto :eof,不goto eof。省略冒號會給你一個「缺失標籤」的錯誤。

0

這是否適合您?

set /p reason=Reason code: 

if "%reason%"=="q" goto :eof 

if %reason% LEQ 2 set /a reason-=1 
if %reason% GTR 2 set /a reason+=1 
相關問題