2013-03-29 134 views
0

這是我第一次嘗試編寫腳本,我正在嘗試創建一個小程序,在循環中執行簡單的除法和模塊,然後計算模塊結果的平均值。 這是我在Linux .sh中嘗試過的,但我怎樣才能使它與Windows .bat兼容?非常感謝您的幫助。Windows腳本編寫

echo "enter first number:" 
read first_num 
echo 「enter second number:」 
read second_num 
while [ first_num && second_num != 999 ] 
do 
    if [ second_num != 0 ]; then 
     echo "Enter first number:" 
     read first_num 
     echo"Enter second number:" 
     read second_num 
     echo first_num "/" second_num "=" $((first_num/second_ num)) >> file.txt 
    else 
     echo "ERROR. Cannot divide by 0. Enter another number:"  
    fi 
done 
if [ first_num == 999 || second_num == 999 ]; then 
    echo "You have exited the loop." 
fi 

#Mod 5 of numbers 1-100: 
for i in {1...100} 
do 
    result=$((i % 5)) 
    echo i + "%5=" + result >> file.txt 
done 

#Average of results: 
int sum=0 
for ((i=1; i<101; i=i+1)) 
do  
    sum=sum+$((i % 5)) 
    average=$((sum/100)) 
    echo average 
    echo average >> file.txt 
done 
+0

'SET/P'接收輸入; 'SET/A'確實數學; 「IF」和「FOR」可用; 'CALL'可以讓你僞造一個代碼塊。詢問時你有什麼樣的答案? – Jon

+0

使用真正的腳本語言。例如bash或sh。甚至更好,Python。但cmd.exe糟透了。堆棧溢出不是一項移植服務。 –

回答

3
echo "enter first number:" 
read first_num 

變得 組/ P FIRST_NUM = 「輸入第一個數字」

while [ first_num && second_num != 999 ] 

沒有WHILE - 具有到有線它。認爲俱樂部和岩石。

:loop 
if %first_num%==999 goto endloop 
if %second_num%==999 goto endloop 

... 

goto loop 
:endloop 

:name是一個標籤,%var%檢索的var內容 - 始終是一個字符串引號如果字符串包含空格。

if [ second_num != 0 ]; then 

翻譯是

if NOT %second_num%==0 (...things...) else (...other things...) 

或,當然

if %second_num%==0 (...other things...) else (...things...) 

夸克:(多箇中的一個):在相同的物理線路必須發生作爲IF第一開括號並且ELSE必須與on-true statemet序列的)位於同一條物理線路上。

echo first_num "/" second_num "=" $((first_num/second_ num)) >> file.txt 

在回波

set /a result=(first_num/second_ num) 

OR

set /a result=(%first_num%/%second_ num%) 

SET /A不能做一個計算適用的算術表達式的結果 - 後添加和多個C形語義

then

echo %first_num%/%second_num% = %result% >> file.txt 

純粹將元素串在一起。

接下來有一個小問題。在解析過程中,任何%var%都被其PARSE-TIME值替換,並執行該行。因此,上面的ECHO行將顯示IF語句輸入時的值,而不是計算後的值。

兩種治療方法:

您可以使用SETLOCAL ENABLEDELATEDEXPANSION切換翻譯模式。在DELAYEDEXPANSION模式下,!var!可用於檢索var的RUN-TIME值。 A SETLOCAL終止於ENDLOCAL或在相同的上下文中達到END-OF-FILE。在SETLOCALENDLOCAL撤消之後,任何環境都會發生變化,這就是爲什麼在@echo off之後通常會立即執行環境 - 保持環境清潔。

第二種治療方法是使用子程序。 CALL :SUB(結腸的意思是「內部的子程序 - 開始標記是在該批處理文件」省略它的意思是「這是一個外部可執行」。)該呼叫創建了一個新的上下文,複製當時存在的環境變量,所以

:sub 
echo %first_num%/%second_num% = %result% >> file.txt 
goto :eof 
當執行 CALL :SUB時,

將顯示環境中的變量。 注意GOTO :EOF(冒號是REQUIRED手段「去實體最終文件的」 - 標籤EOF應該宣佈...

(小心也流過正常放置在批處理文件中結束子程序一種明智GOTO :EOF確保流通不會發生......

#Mod 5 of numbers 1-100: 

的意見指示燈正式REM

rem Mod 5 of numbers 1-100: 

::Mod 5 of numbers 1-100: 

經常使用,因爲它更容易一些,但因爲它實際上是一個標籤的濫用,它實際上是一個標籤,標籤不能在複合語句中使用,你不能使用它的IF ... (...) else (...)FOR...DO (...)

for i in {1...100} 

括號內變得

for /L %%i in (1,1,100) do (

的metavariable %%i是大小寫敏感的和單個字符。在一個FOR /L元件被(開始,步驟,結束) - 見從提示FOR /?(或通常command /?從提示),用於docco ...

result=$((i % 5)) 

變得

set /a result=%%i %% 5 

/a因爲RHS是要評估的算術表達式; %% 5因爲%逸出%,空間是不相關的,並且所述處理器需要知道的是,MOD運算符%正在被使用,不%5(第五命令行參數)

int sum=0 

沒有這樣的東西作爲類型;所有的環境變量是字符串,只能由set /a聲明解釋爲整數

如此 - 這是對所有有它...

+0

+1這顯示了cmd的真實顏色;-) –

0

希望您正在尋找這樣的:

@echo off 
setlocal enabledelayedexpansion 
> file.txt type nul 
:loopInput 
echo enter first number: 
set /p first_num= 
echo enter second number: 
set /p second_num= 

if !first_num! neq 0 (
    if !second_num! neq 999 (
     if !second_num! equ 0 (
      echo ERROR. Cannot divide by 0. Enter another number: 
      goto loopInput 
     ) 
     goto loopDiv 
    ) 
) 
goto :skipDiv 

:loopDiv 
set /a division=first_num/second_num 

>> file.txt echo !first_num!/!second_num! = !division! 
goto loopInput 

:skipDiv 
echo You have exited the div loop. 

>> file.txt echo Mod 5 of numbers 1-100: 
for /l %%a in (1,1,100) do (
    set /a mod=%%a%%5 
    >> file.txt echo %%a %% 5 = !mod! 
) 

set sum=0 
for /l %%a in (1,1,100) do (
    set /a sum+=%%a%%5 
) 
set /a average=sum/100 
>> file.txt echo Average of results: !average!