批處理中的變量和參數(二)


-----siwuxie095

   

   

   

二、自定義變量

   

一般用 set 讀入的方法定義和賦值

   

1、程序里設置變量

set var=Hello World!

echo %var%

pause>nul

   

sublime中:

   

   

   

2、讀入的方法設置變量

set /p var=請輸入一個變量:

echo %var%

pause >nul

   

sublime中:

   

   

   

   

   

   

提到變量就不能不提批處理中的兩個符號:% !

   

批處理中,對變量不用像C語言一樣預先定義就可以使用,非常自由

看似自由的機制,卻又讓人又痛苦:在沒有預先說明哪些符號是變量

的情況下,計算機的識別問題。

   

解決方案:在編程時,對要使用的變量用 % 標明,在延遲變量的情況下

! 標明

   

如:常規情況下

@echo off

set num=12

echo %num%

pause

   

如:延遲變量情況下

@echo off

setlocal enabledelayedexpansion

set num=12

for /l %%i in (1,1,5) do (

set /a num+=10

echo !num!

)

pause

   

這兩個例子就是關於常規情況下變量符號 %延遲變量情況下變量符號

的使用,其功能在於告訴計算機該串代碼是變量

   

   

%0 - %9 %* 十一個符號中的 % 不是代表變量,而是參數的意思,

參數和普通變量不同,不能改變參數的值

   

for 里的 %%i,兩個 % 標出的不是普通變量,而是循環變量,

循環變量和普通變量不同,不能改變循環變量的值

   

for 里的循環變量 %%i 和 參數 %0 - %9,其整體代表變量,引用時

不能再對其增加變量符號 % !

   

   

在計算中,% 表示取余,如:

@echo off

set num=100

set /a result=num%%7

echo %result%

pause

   

在輸出格式中,% 表示輸出格式的意思 %str:~m,n%,詳見 set 命令

   

   

總結:% 應用范圍:變量、參數、循環變量、余數計算、格式

   

   

   

   

   

   

系統參數

%0%1%2%3%4%5%6%7%8%9%*

   

   

對於 %1 - %9

%1 批處理的第一個參數

%2 批處理的第二個參數

%3 批處理的第三個參數

%4 批處理的第四個參數

%5 批處理的第五個參數

%6 批處理的第六個參數

%7 批處理的第七個參數

%8 批處理的第八個參數

%9 批處理的第九個參數

   

批處理有且僅有這九個參數,不存在 %10 及以上參數

   

   

因為 call 命令允許使用參數,先看參數在 call 中的應用:

@echo off

call :loop Hello World!

pause>nul & goto :eof

:loop

echo %1

echo %2

 

sublime中:

   

   

運行一覽:

   

   

   

計算機認為 Hello World! 是兩個參數,如果想讓其是一個參數,

應該用雙引號(英文格式)引起來

   

   

再如:用 call 帶參數遞歸算階乘

@echo off

title 階乘--遞歸算法

echo. & echo. & echo 階乘--遞歸算法

setlocal enabledelayedexpansion

echo. & echo.

set /p n=請輸入一個數

set result=1

if !n!==0 (echo 結果等於 1 & pause>nul & goto eof) else (call :loop !n!)

echo. & echo 結果等於!result!

pause>nul

:loop

if not %1==1 (

set /a result=!result!*%1

set /a x=%1

set /a x-=1

call :loop !x!

)

   

sublime中:

   

   

運行一覽:

   

 

   

   

參數也不止用在 call上,其他例子:

同一個目錄下,有兩個bat文件:

123.bat:

@echo off

start abc.bat 1,2,3,4

call abc.bat a b c d

pause

   

abc.bat:

@echo off

echo %1

echo %2

echo %3

echo %4

pasue>nul

   

   

運行 abc.bat 一覽:

   

   

   

運行 123.bat 一覽:彈出兩個窗口

   

   

   

   

可見:賦予參數時,參數和參數之間用逗號 空格隔開都可以

   

   

   

如:F盤根目錄下有一個 test.bat

@echo off

format %1

   

   

在cmd窗口中執行:

   

   

   

在執行 test.bat 時,%1 就表示 z:,這樣 format %1 就相當於

format z:,即格式化 Z盤

   

但此程序明顯用 set 讀入更簡單:

@echo off

set /p a=請輸入一個驅動器號:

format %a%

pause>nul

   

運行一覽:

   

   

   

雙擊執行 test.bat,輸入 z:,若存在 Z盤,就會格式化 Z盤

(顯然 這里 set 比 %1 - %9 簡單)

   

   

   

   

再如:F盤根目錄下有 test.bat,a.txt,b.txt:

@echo off

type %1

type %2

   

在cmd窗口中執行:將順序顯示 a.txt,b.txt 中的內容

   

   

   

   

很明顯:同樣可以不用 %1 - %9 就能實現顯示文本文件

   

   

再看:刪除文件和文件夾

del /f /q %1

rd /q /s %1

   

   

在cmd中執行時,像上面一樣直接賦予要刪除的文件(夾)的名字當

參數即可,實際上可以更簡單,直接拖放某文件(夾)到這個 bat 文

件上面,即可徹底刪除

   

之所以用了兩個命令 del 和 rd ,是為了保證可以刪除文件以及文件夾,

加上參數,是為了刪除前不必經過確認就刪除

   

   

   

%* 的作用不是很大,只是返回參數,不過它是一次返回全部參數的值,

不用輸入 %0 - %9 來一個個確定

   

如:

@echo off

echo %*

   

在cmd窗口中執行:空格也一起輸出了

   

   

   

   

   

參數最多只能有九個,測試程序如下:

@echo off

echo %1

echo %10

echo %11

pause>nul

   

sublime中:

   

   

在cmd窗口中執行:

   

   

   

咋一看,參數在10及以上似乎可以,其實不然,變換測試:

   

   

顯然,%10 及以上是無效參數,但如果不指定返回參數,用 %*

輸出全部參數,參數個數就沒有限制了

   

   

   

%0 不是返回參數,其有兩層意思:

第一層:如果 %0 前有 echo 等命令,則代表返回該批處理所在的絕對路徑

第二層:如果 %0 前沒有任何參數,則代表自身批處理,會無限循環執行

bat(也就是調用自身 bat 程序)

   

如:

@echo off

echo %0

pause

   

運行一覽:

   

   

   

此顯示結果帶雙引號,如果不想要雙引號,這么寫:

@echo off

for %%i in (%0) do echo %%~i

pause

   

運行一覽:

   

   

   

再如:無限循環執行 net user,即不斷顯示用戶賬戶信息,

直到你手動停止為止(Ctrl+C)

@echo off

net user

%0

   

運行一覽:

   

   

   

再如:將自身復制到 D盤,並命名為 testx.bat

@echo off

echo Hello World!

copy %0 d:\testx.txt

   

運行一覽:

   

   

   

   

   

   

   

%0 高級用法:

   

1、最簡單的死循環程序,同時也是最簡單的批處理程序:

%0

   

運行一覽:不斷重復顯示自身路徑,直到手動停止(Ctrl+C)

   

   

   

2、用 %0 實現嵌套和遞歸

   

不僅是 call 調用函數的時候可以使用參數,%0 同樣可以

如:

@echo off

set /a var=%1+1

echo %var%

if %var% lss 100 (%0 %var%) else pause

   

sublime中:

   

   

運行一覽:從 1 顯示到 100

   

   

   

   

如果用 call,就變成:

@echo off

:loop

set /a var=%1+1

echo %var%

if %var% lss 100 call :loop %var%

pause

   

sublime中:

   

   

   

效果一樣

   

   

【made by siwuxie095】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM