2017-08-06 145 views
1

應該發生的是您輸入的數字在1到1,048,567之間。該程序檢查您的輸入是否實際上是介於1和1,048,567之間的數字。如果你的輸入是一個有效的數字,那麼它將繼續到下一個代碼。如果輸入無效,則會顯示一條消息,說明該消息無效,然後再循環並再次請求輸入。 然而,當我運行這個時,我輸入了任何內容,即使輸入了一個介於1和1,048,567之間的數字,它也會顯示輸入無效。我的.bat腳本中的if語句沒有按預期工作

代碼:

:setup 
@echo off 
title Pokemon Shiny Sim 
set delay = nul 
set count = 0 
set chance = 4096 

:settings 
:setChance 
cls 
echo Set shiny chance (1 in x). Range: (1-1,048,567) 
echo Leave blank for 1 in 4096. 
set /p chance = Input: 
set /a chance = %chance%+0 
if %chance% GEQ 1 (
    if %chance% LEQ 1048567 (
     goto setDelay 
    ) 
) 
echo Invalid Input. 
pause 
goto setChance 
:setDelay 
cls 
echo Set delay between attempts in seconds. Range: (1-60). 
echo Leave blank for no delay. 
set /p delay = Input: 
set /a delay = %delay%+0 
if %delay% == nul (
    goto loopStart 
) 
if %delay% GEQ 1 (
    if %delay% LEQ 60 (
     cls 
     goto loopStart 
    ) 
) 
echo Invalid Input. 
pause 
goto settings 

:loopStart 
set /a count = %count%+1 
set /a rand = %random% %% %chance%+1 
if %rand% == 1 (
    echo Attempt: %count% | Shiny: Yes! 
    pause 
) 
else (
    echo Attempt: %count% | Shiny: No 
) 
goto loopStart 
+2

你正在設置一個變量:你正在設置一個變量'chance'(注意這個空格!)刪除等號之間的空格 – SteveFest

+1

另外,你在迴避'''管道'|'而不會逃逸。使用'^ |'而不是'|' – SteveFest

+0

@SteveFest感謝提示錯誤設置變量和回顯| |。儘管原來的問題仍然存在。 –

回答

0

我建議先讀debugging a batch file和第二答案上
Why is no string output with 'echo %var%' after using 'set var = text' on command line?

接下來看看下面的代碼重寫:

:setup 
@echo off 
title Pokemon Shiny Sim 
set "delay=0" 
set "count=0" 
set "chance=4096" 

:settings 
:setChance 
cls 
echo Set shiny chance (1 in x). Range: (1-1,048,567) 
echo Leave blank for 1 in 4096. 
set /P "chance=Input: " 
set /A chance+=0 

if %chance% GEQ 1 if %chance% LEQ 1048567 goto setDelay 

echo Invalid input. 
pause 
goto setChance 

:setDelay 
cls 
echo Set delay between attempts in seconds. Range: (1-60). 
echo Leave blank for no delay. 
set /P "delay=Input: " 
set /A delay+=0 

if %delay% == 0 goto loopStart 
if %delay% GEQ 1 if %delay% LEQ 60 cls & goto loopStart 

echo Invalid input. 
pause 
goto settings 

:loopStart 
set /A count+=1 
set /A rand=%random% %% chance + 1 
if %rand% == 1 (
    echo Attempt: %count% ^| Shiny: Yes! 
    pause 
) else (
    echo Attempt: %count% ^| Shiny: No 
) 
goto loopStart 

圍繞等號所有的空間在此批代碼被刪除。

命令行set "delay = nul"被修改以set "delay=0"因爲條件if %delay% == nul是從來沒有的set /a delay = %delay%+0執行導致set /a delay = nul + 0執行,這導致上nul分配值0到環境變量delay不存在作爲環境變量與具有該名稱後真整數值。有效算術表達式的結果始終是一個作爲字符串分配給環境變量的數字,絕不會有像nul這樣的字符串。

set /a chance = %chance%+0被修改爲set /A chance+=0set /a delay = %delay%+0被修飾以set /A delay+=0因爲否則輸入檢查是因爲用戶具有例如自由進入|用於產生命令行set /a chance = |+0的執行可變chance引起批次的意外退出不安全文件執行。

從不使用%variable%!variable!作爲通常不需要的算術表達式。

在幾個頁面上的幫助輸出在命令提示符窗口中運行set /?解釋關於每個不能被解釋爲數字或運算符字符串被自動解釋成一個環境變量,其當前的名字set /A使用章節值應該轉換爲評估表達式的整數。如果根本沒有定義環境變量,或者其值無法成功轉換爲32位有符號整數,則會在整數值0中將其替換爲表達式。

在算術表達式中使用隨機數有例外,這要求使用%random%!random!或者當變量名稱包含空格字符或將被解釋爲運算符的字符時。在這種情況下,Windows命令解釋程序必須用環境變量的隨機值分別替換已處於預處理狀態或立即執行命令set之前的環境變量名稱。

set /a chance = %chance%+0使得它也有可能是這個批處理文件的用戶,例如PROCESSOR_LEVELPROCESSOR_REVISION且此輸入進入雖然不是被一些都將因爲這兩個字符串是具有數字作爲環境變量的名字處理爲有效值。 PROCESSOR_REVISION默認具有分配的十六進制數字,但可以完全或部分地按照命令set的數量進行處理。

另一個語法錯誤是在塊

if %rand% == 1 (
    echo Attempt: %count% | Shiny: Yes! 
    pause 
) 
else (
    echo Attempt: %count% | Shiny: No 
) 

關鍵字else必須在同一條線上的從)用空格字符分隔的IF條件分支的閉合)

並且重定向運算符|必須與脫字符字符^一起轉義爲被解釋爲文字字符以輸出到控制檯窗口。

注:set /A chance+=0使得它仍然可能例如170 percent170X導致chance具有價值170,因此輸入有效的,儘管在實際輸入的字符串不是一個數字輸入。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • cls /?
  • echo /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • title /?
+0

對於我做錯了什麼的詳細解釋非常有幫助。那你! :) –

0

我沒有測試的代碼,但是我發現在代碼中的一些致命的問題。


誤設置變量

set /a count = %count% + 1 

這將設置一個變量count(注意空格!)。刪除空間!此外,這可以縮短爲set /a count+=1


ECHO荷蘭國際集團的特殊字符

|是批量重定向保留的特殊字符之一。要正確地使用echo,請使用echo string ^| string


IF聲明實踐

if %rand% == 1 (

只有當%rand%是字母數字的作品。如果%rand%是空格,則cmd.exe會看到:

if == 1 (

這是不正確的。

要糾正它,做

if "%rand%"=="1" (

或者,使用EQU的數值比較,並==的字符串比較。

+1

我永遠不會推薦使用它,但即使'set/a「count =%count%+ 1」'也不會在變量名稱中留出空格。嘗試一下!只有在沒有'/ a'的情況下才會設置此行爲。 – LotPings

+0

@LotPings這很有趣,我會盡快試用 – SteveFest

+0

我用你的建議更新了我的代碼,它在任何輸入無效的情況下仍然存在同樣的問題。 –