-----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】