批處理腳本


常用dos命令

 批處理復制文件(文件夾)

 

1.復制C:\a\e.txt 文本文件到d:\b文件夾下面
【復制完的目錄結構應該為d:\b\e.txt】
xcopy /y c:\a\e.txt d:\b\ >nul
2.復制C:\a文件夾及其內所有東西(包括隱藏,系統文件)到D:\b文件夾下面
【 a文件夾也要復制過去,也就是說,復制之后,a文件夾應該在b文件夾下】
xcopy /y /e /h c:\a d:\b\a\ >nul
3.復制C:\a文件夾內的所有東西到D:\b文件夾下面
【a文件夾不復制過去,只是把c,d這兩個文件夾和e.txt這個文件復制過去】
xcopy /y /e /h c:\a d:\b\ >nul

 

批處理中cd進其他目錄
加 /d參數就可以了。
cd /d d:\

 

一、批處理基礎

批處理是將一系列命令按一定的順序集合為一個可執行的文本文件,其擴展名為BAT 或者CMD。這些命令統稱批處理命令。

可以在鍵盤上按下Ctrl+C組合鍵來強行終止一個批處理的執行過程。

批處理命令不區分大小寫。

命令不懂,直接在CMD下面輸入: name /? 這樣的格式來看系統給出的幫助文件,比如for /? 就會把FOR命令的幫助全部顯示出來!

在批處理中,將命令放在單引號中命令會被執行,將命令放在雙引號中,命令會被當成字符串讀取。

DOS轉義字符 

 

期望得到的字符 轉義后字符  
% %% May not always be required in doublequoted strings, just try
^ ^^ May not always be required in doublequoted strings, but it won't hurt
& ^&
<</code> ^<</code>
> ^>
| ^|
' ^' Required only in the FOR /F "subject" (i.e. between the parenthesis),unless backq is used
` ^` Required only in the FOR /F "subject" (i.e. between the parenthesis), ifbackq is used
, ^, Required only in the FOR /F"subject" (i.e. between the parenthesis), even in doublequoted strings
; ^;
= ^=
( ^(
) ^)
! ^^! Required only when delayed variable expansionis active
\ \\ Required only in the regex pattern of FINDSTR
[ \[
] \]
" \"

 

mkdir 目錄名 創建目錄
md 目錄名 創建目錄
rd 目錄名 刪除目錄(用rd命令刪除的目錄必須是空的且不能刪除根目錄和當前目錄)
rmdir 目錄名 刪除目錄(用rd命令刪除的目錄必須是空的且不能刪除根目錄和當前目錄)

 

copy 123 c:\filename 創建一個文件,並同時添加一些內容
type nul >c:\filename 創建一個空文件
echo. >c:\filename 創建一個空文件
del c:\filename 刪除文件

 

 我們最好使用絕對路徑去操作文件,以下是絕對路徑的獲取方式:
@echo off
echo 當前盤符:%~d0 
echo 當前盤符和路徑:%~dp0 
echo 當前批處理全路徑:%~f0 
echo 當前盤符和路徑的短文件名格式:%~sdp0 
echo 當前CMD默認目錄:%cd% 
pause

 

 

1、rem 和 ::

Rem為注釋命令,rem后的內容不被執行,但能回顯。

:: 為注釋命令,  ::后的字符行執行時不會回顯, 無論是否用echo on打開命令行回顯。

2、echo和 @

(1)echo 信息內容   #輸出提示信息  

(2)ECHO 文件內容>文件名  #建立新文件  

(3)ECHO 文件內容>>文件名  #增加文件內容  

(4)ECHO.   #輸出空行,即相當於輸入一個回車 。“.”要緊跟在 ECHO 后面中間不能有空格。 “.”可以用,:;/[\]+等任一符號替代。 ECHO.輸出的回車可以經DOS管道轉向作為其它命令的輸入,比如echo.|time相當於在TIME命令執行后給出一個回車。所以執行時系統會在顯示當前時間后,自動返回到DOS 提示符狀態

(5)ECHO 答復語|命令文件名  #答復命令中的提問  

用於簡化一些需要人機對話的命令的操作,它是通過 DOS 管道命令把 ECHO 命令的輸出作為人機對話命令的輸入。下面的例子就相當於在調用的命令出現人機對話時輸入“Y”回車:C:>ECHO Y|CHKDSK /F

(6)echo [{ on|off }]  #打開回顯或關閉回顯功能,echo off,能夠關閉 DOS 提示符的顯示使屏幕只留下光標,直至鍵入ECHO ON,提示符才會重新出現。

(7)@放在命令前用於關閉該命令的回顯,無論此時echo是否為打開狀態。如果想關閉“echo off”命令行自身的顯示,則需要在該命令行前加上“@”。

3、pause

pause,是暫停的意思 就是停止系統命令的執行並顯示 請按任意鍵繼續. . .” 

4title  設置cmd窗口的標題

title 新標題       #可以看到cmd窗口的標題欄變了  

5、color

設置默認的控制台前景和背景顏色。 color [attr]

attr  指定控制台輸出的顏色屬性,顏色屬性由兩個十六進制數字指定,第一個為背景,第二個則為前景。例如: " color fc" 在亮白色上產生亮紅色。如果沒有給定任何參數,該命令會將顏色還原到 dos啟動時的顏色。

     0 = 黑色        8 = 灰色

     1 = 藍色        9 = 淡藍色

     2 = 綠色        A = 淡綠色

     3 = 湖藍色      B = 淡淺綠色

     4 = 紅色        C = 淡紅色

     5 = 紫色        D = 淡紫色      

    6 = 黃色        E = 淡黃色

    7 = 白色        F = 亮白色

6、goto和 :

goto跳轉的意思,允許以“:XXX”來構建一個標簽,然后用GOTO XXX跳轉到標簽:XXX處執行標簽后的命令,標簽的名字可以隨便起,前加個冒號用來表示這個字符串是標簽,goto命令就是根據這個冒號(:)來尋找下一步跳到到那里。如果不設結束條件,goto可以持續執行下去。 

@echo off

:start

Set /a var+=1

Echo %var%

If %var% leq 3 GOTO start

Pause

運行顯示:

1

2

3

4

7、find 在文件中搜索字符串

find [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

   /V          顯示所有未包含指定字符串的行。

   /C          僅顯示包含字符串的行數。

   /N          顯示行號。

   /I           搜索字符串時忽略大小寫。

   "string"  指定要搜索的文字串,

   [drive:][path]filename             指定要搜索的文件。

如果沒有指定路徑find將搜索鍵入的文字或另一命令產生的文字。

8、type顯示文本文件的內容

TYPE [drive:][path]filename   顯示文本文件的內容

find常和type 命令結合使用

find "string"  filename

type [drive:][path]filename | find "string" [>tmpfile]  #挑選包含string的行

type [drive:][path]filename | find /v "string"            #剔除文件中包含string的行

type [drive:][path]filename | find /c                       #顯示文件行數  

8、start 命令

調用外部程序的命令(該外部程序在新窗口中運行,批處理程序繼續往下執行,不理會外部程序的運行狀況)

例:start explorer d:\   調用圖形界面打開D盤  

start xxx.bat   調用調用外部的一個批處理

9、call

call調用另一個批處理,當另一個批處理執行完后再繼續執行原來的批處理

call [drive:][path]filename [batch-parameters] 調用的其它批處理程序。filename 參數必須具有 .bat 或 .cmd 擴展名。

call :label arguments 調用本文件內命令段,相當於子程序。被調用的命令段以標簽:label開頭以命令goto :eof結尾。   

例:

Set aa=123456

Set cmdstr=echo %aa%

Call %cmdstr%

Pause

本例中如果不用call,而直接運行%cmdstr%,將顯示結果%aa%,而不是123456

10、setlocal 變量延遲  

變量延遲的啟動語句是“setlocal enabledelayedexpansion”,並且變量要用一對嘆號“!!”括起來,否則就沒有變量延遲的效果。

批處理讀取命令時是按行讀取的,在沒有開啟變量延遲的情況下,某條命令行中的變量改變,必須到下一條命令才能體現。

 @echo off

 set a=4

 set a=5 & echo %a%

 Pause

結果:4

啟動變量延遲后,就會得到正確答案。

 @echo off

 Setlocal enabledelayedexpansion

 Set a=4

 Set a=5 & echo !a!

 Pause  

結果:5

11、shift

shift [/n]  更改批處理文件中可替換參數的位置。

如果命令擴展名被啟用,shift命令支持/n 命令行開關;該命令行開關告訴命令從第n個參數開始移位;n 介於零和8之間。例如:

 shift  /2 會將 %3 移位到 %2,將 %4 移位到 %3,等等;並且不影響 %0 和 %1。  

12、% 變量引導符

1)引用變量用%var%

2)調用程序外部參數用%1 至%9、*%等。

%1 第一個參數,%9 第九個參數

%* 從第一個參數開始的所有參數參數

%0 批處理文件本身,包括完整的路徑和擴展名。%0可以調用批處理自身,以達到批處理本身循環的目的,也可以復制文件自身等。例:最簡單的復制文件自身的方法

copy %0 d:\wind.bat

 

@echo off

Echo %1 %2 %3 %4

Echo %1

Echo %2

Echo %3

Echo %4 

把上下面的代碼保存為test.bat,然后輸入 d:\test.bat 我是第一個參數 我是第二個參數  我是第三個參數  我是第四個參數,注意中間的空格,我們會看到這樣的結果:

我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數

我是第一個參數

我是第二個參數

我是第三個參數

我是第四個參數

對比下代碼,%1就是”我是第一個參數”  %2 就是”我是第二個參數”

 

@echo off
net user
%0

保存為BAT 執行,他就會無限循環執行net user這條命令,直到你手動停止.

 

13、|  命令管道符

格式:第一條命令 | 第二條命令 [| 第三條命令...]     將第一條命令的結果作為第二條命令的參數來使用管道命令的優先級高於重定向命令,重定向命令的優先級高於組合命令

dir c:\|find "txt"    顯示C:\下的目錄文件和子目錄列表,並發現TXT字符串。

 

14、>   輸出重定向

作用是將運行的結果傳遞到后面的范圍(后可以是文件,也可以是默認的系統控制台)

 

15、>>  輸出重定向

作用和>有點類似,但他們的區別是>>是傳遞並在文件的末尾追加,而>是覆蓋

 

16、<  輸入重定向

從文件中讀入命令輸入,而不是從鍵盤中讀入。

@echo off

Echo 2005-05-01>temp.txt

Date <temp.txt

Del temp.txt

這樣就可以不等待輸入直接修改當前日期

 

17、>&、<& 重定向符

其中的stdin可被<重定向,stdout可被>、>>重定向。

> :代表重定向到哪里,例如:echo "123" > /home/123.txt
1 :表示stdout標准輸出,系統默認值是1,所以">/dev/null"等同於"1>/dev/null"
2 :表示stderr標准錯誤
& :表示等同於的意思,2>&1,表示2的輸出重定向等同於1

command >out.file 2>&1 &

command >out.file是將command的標准輸出重定向到out.file文件(即輸出內容不打印到屏幕上)。2>&1 是將標准錯誤重定向到標准輸出,這里的標准輸出已經重定向到了out.file文件,即將標准出錯也輸出到out.file文件中。最后一個& , 是讓該命令在后台執行。

 

17、^  轉義字符

^是針對特殊符號<、>、&的前導字符,在命令中他將以上 3 個符號的特殊功能去掉,僅僅只把他們當成符號而不使用他們的特殊意義。

比如

echo test ^>1.txt

結果則是:test > 1.txt

另外此轉義字符還可以用作續行符號。因為每行末尾還有一個看不見的回車符,轉義字符位於行尾時就讓回車符失效了,從而起到了續行的作用。

 

18、&  組合命令

語法:第一條命令 & 第二條命令 [& 第三條命令...]

&為組合命令,可以把多個命令組合起來當一個命令來執行,當第一個命令執行失敗了,也不影響后邊的命令執行。

dir z:\ & dir y:\ & dir c:\

以上命令會連續顯示z,y,c盤的內容,不理會該盤是否存在  

 

19、&& 組合命令

語法:第一條命令 && 第二條命令 [&& 第三條命令...]

同時執行多條命令,當碰到執行出錯的命令后將不執行后面的命令,如果一直沒有出錯則一直執行完所有命令。

  dir c:\ && dir d:\ > a.txt

這樣執行后a.txt里只有D盤的信息!因為組合命令的優先級沒有重定向命令的優先級高!所以這句在執行時將本行分成這兩部分:dir c:\和dir d:\ > a.txt

若要a.txt里有C、D盤,則必須得這么寫: dir c:\ > a.txt && dir d:\ >> a.txt

 

20、||  組合命令

語法:第一條命令 || 第二條命令 [|| 第三條命令...]

可以同時執行多條命令,當一條命令失敗后才執行第二條命令,若執行正確將不執行后面的命令。

 

21、""  字符串界定符

在批處理中,將命令放在單引號中命令會被執行,將命令放在雙引號中,命令會被當成字符串讀取。

雙引號允許在字符串中包含空格,進入一個特殊目錄可以用如下方法

cd "program files"

cd progra~1

cd pro*

以上三種方法都可以進入program files這個目錄  

 

22、, 逗號

逗號相當於空格,在某些情況下“,”可以用來當做空格使

比如

dir,c:\  

 

23、; 分號

當命令相同時可以將不同目標用;來隔離,且執行效果不變,如執行過程中發生錯誤,則只返回錯誤報告,但程序仍會執行。

例:dir c:\;d:\;e:\1.txt

以上命令相當於

Dir c:\

Dir d:\

Dir e:\1.txt

其中文件e:\1.txt不存在,但 e盤存在,有錯誤提示,但命令仍會執行。如果目標路徑不存在,則終止執行;如果路徑存在,僅文件不存在,則繼續執行。

 

24、() 括號

左右括號必須成對使用,括號中可以包括多行命令,這些命令將被看成一個整體,視為一條命令行。 括號在 for 語句和 if 語句中常見。

命令:echo 1 & echo 2 & echo 3

可以寫成:

(

echo 1

echo 2

echo 3

)

上面兩種寫法效果一樣,這兩種寫法都被視為是一條命令行。

注意:這種多條命令被視為一條命令行時,如果其中有變量,就涉及到變量延遲的問題。

 

25、! 感嘆號

在變量延遲問題中用來表示變量,即%var%應該表示為!Var!。

 

26、attrib顯示或更改文件屬性

attrib [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]

   +   設置屬性。

   -    清除屬性。

   R   只讀文件屬性。

   A   存檔文件屬性。

   S   系統文件屬性。

   H   隱藏文件屬性。

   [drive:][path][filename]  指定要處理的文件屬性。

   /S  處理當前文件夾及其子文件夾中的匹配文件。

   /D  也處理文件夾。

例:

md autorun

attrib +a +s +h autorun

上面的命令將建立文件夾autorun,然后將其設為存檔、系統、隱藏屬性

 

27、pushd 和 popd

切換當前目錄, 一般用處不大,在當前目錄名不確定時,會有點幫助。(dos編程中很有用)

@echo off

c: & cd\ & md mp3        #在 C:\ 建立 mp3 文件夾

md d:\mp4                #在 D:\ 建立 mp4 文件夾

cd /d d:\mp4             #更改當前目錄為 d:\mp4

pushd c:\mp3             #保存當前目錄,並切換當前目錄為 c:\mp3

popd                     #恢復當前目錄為剛才保存的 d:\mp4

 

28、assoc 和 ftype

Assoc 設置'文件擴展名'關聯,關聯到'文件類型'

Ftype 設置'文件類型'關聯,關聯到'執行程序和參數'

當你雙擊一個.txt文件時,windows 並不是根據.txt直接判斷用notepad.exe打開,而是先判斷.txt屬於 txtfile '文件類型',再調用 txtfile關聯的命令行 txtfile=%systemroot%\system32\NOTEPAD.EXE %1

可以在"文件夾選項"→"文件類型"里修改這 2 種關聯

Assoc            #顯示所有'文件擴展名'關聯

Assoc .txt        #顯示.txt'文件擴展名'關聯

ftype            #顯示所有'文件類型'關聯

ftype exefile    #顯示exefile 類型關聯的命令行,結果顯示 exefile="%1" %*  

 

Assoc .txt=Word.Document.8   設置.txt為 word類型的文檔,可以看到.txt文件的圖標都變了

Assoc .txt=txtfile    恢復.txt的正確關聯  

Ftype exefile="%1" %*  恢復 exefile 的正確關聯

 

二、批處理中的變量

批處理中的變量分為兩類,分別為"系統變量"和"自定義變量"

1、系統變量

他們的值由系統將其根據事先定義的條件自動賦值,也就是這些變量系統已經給他們定義了值, 不需要我們來給他賦值,我們只需要調用而以!

%ALLUSERSPROFILE% 本地 返回“所有用戶”配置文件的位置。

%APPDATA% 本地 返回默認情況下應用程序存儲數據的位置。

%CD% 本地 返回當前目錄字符串。

%CMDCMDLINE% 本地 返回用來啟動當前的 Cmd.exe 的准確命令行。

%CMDEXTVERSION% 系統 返回當前的“命令處理程序擴展”的版本號。

%COMPUTERNAME%  系統 返回計算機的名稱。

%COMSPEC%  系統 返回命令行解釋器可執行程序的准確路徑。

%DATE%  系統 返回當前日期。使用與 date /t 命令相同的格式。

%ERRORLEVEL%  系統 返回上一條命令的錯誤代碼。通常用非零值表示錯誤。

%HOMEDRIVE%  系統 返回連接到用戶主目錄的本地工作站驅動器號。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。

%HOMEPATH%  系統 返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。

%HOMESHARE%  系統 返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。

%LOGONSERVER%  本地 返回驗證當前登錄會話的域控制器的名稱。

%NUMBER_OF_PROCESSORS%  系統 指定安裝在計算機上的處理器的數目。

%OS%  系統 返回操作系統名稱。Windows 2000 顯示其操作系統為 Windows_NT。

%PATH% 系統 指定可執行文件的搜索路徑。

%PATHEXT% 系統 返回操作系統認為可執行的文件擴展名的列表。

%PROCESSOR_ARCHITECTURE%  系統 返回處理器的芯片體系結構。值:x86 或 IA64 基於Itanium

%PROCESSOR_IDENTFIER% 系統 返回處理器說明。

%PROCESSOR_LEVEL%  系統 返回計算機上安裝的處理器的型號。

%PROCESSOR_REVISION% 系統 返回處理器的版本號。 %PROMPT% 本地 返回當前解釋程序的命令提示符設置。

%RANDOM% 系統 返回 0 到 32767 之間的任意十進制數字。

%SYSTEMDRIVE% 系統 返回包含 Windows server operating system 根目錄(即系統根目錄)的驅動器。

%SYSTEMROOT%  系統 返回 Windows server operating system 根目錄的位置。

%TEMP% 和 %TMP% 系統和用戶 返回對當前登錄用戶可用的應用程序所使用的默認臨時目錄。有些應用程序需要 TEMP,而其他應用程序則需要 TMP。

%TIME% 系統 返回當前時間。使用與 time /t 命令相同的格式。

%USERDOMAIN% 本地 返回包含用戶帳戶的域的名稱。

%USERNAME% 本地 返回當前登錄的用戶的名稱。

%USERPROFILE% 本地 返回當前用戶的配置文件的位置。

%WINDIR% 系統 返回操作系統目錄的位置。

2、自定義變量

自定義變量使用set命令SET [variable=[string]]
SET /?查看SET 的幫助 
SET #鍵入不帶參數的set是顯示當前環境變量
SET variable= #清除變量variable的值,使其變成未定義狀態。
SET variable="" #此時變量值並不為空,而是等於兩個引號,即""
SET /P variable=[promptstring] #提供一個交互界面,讓用戶自己輸入變量的值
Set var=我是值 #Var為變量名,=號右變的是要給變量的值,這就是最簡單的一種設置變量的方法了

在批處理中要引用變量就把var變量名用兩個%擴起來:%var%

 

三、set命令

set命令除了可以設置自定義變量外還可以進行數學計算。

SET /A expression /A參數就是讓SET 可以支持數學符號進行加減等一些數學運算!數字表達式以遞減的優先權順序支持下列操作(一般的運算常為十進制運算,如果數字字符串最左邊為 0,將被認為是八進制,從而出錯):
() -分組
! ~ - -一元運算符
* / % -算數運算符
+ - -算數運算符
<< >> -二進制邏輯移位
& -二進制按位“與”
^ -二進制按位“異”
| -二進制按位“或”
= *= /= %= += -= -算數賦值
&= ^= |= <<= >>= -二進制運算賦值
, -表達式分隔符

@echo off
Set /p input=請輸入計算表達式:
Set /a var=%input%
Echo 計算結果:%input%=%var%
Pause
請輸入計算表達式:1+9+20+30-10
計算結果:1+9+20+30-10=50
請按任意鍵繼續. . .

DOS計算只能精確到32位,這個32位是指二進制32位,其中最高位為符號位(0 為正,1 為負),低位 31 位為數值。31 個 1 換成十進制為 2147483647,所以DOS 計算的有效值范圍是-2147483648 至2147483647,超出該數值范圍時計算出錯

有時候我們需要直接在原變量進行加減操作就可以用這種語法 set /a var+=1即set /a var = %var% + 1。還有一些用邏輯或取余操作符,這些符號,按照上面的使用方法會報錯的,對於這樣的"邏輯或取余操作符",我們需要把他們用雙引號引起來,也可以用轉義字符^。
Set /a var= 1 "&" 1 這樣結果就顯示出來了
Set /a var= 1 "+" 1 異運算
Set /a var= 1 "%" 1 取模運算
Set /a var= 3 "<<" 2 左移位運算, 3的二進制為11,左移 2位為 1100,換成十進制就是12
Set /a var= 4 ">>" 2右移位運算,4的二進制為100,右移動2位為1,結果為1

@echo off
Set /p n=請輸入2的幾次方:
Set /a num=1^<^<n
Echo %num%
Pause
運行結果:
請輸入2的幾次方: 3
8
請按任意鍵繼續. . .

 

四、字符串的替換和截取

1、字符串替換

%PATH:str1=str2% 將字符串變量%PATH%中的str1替換為str2
@echo off
Set a=bbs.verybat.cn
Echo 替換前的值: "%a%"
Set var=%a:.=點%
Echo 替換后的值: "%var%"
Pause
運行顯示: 
替換前的值: "bbs.verybat.cn"
替換后的值: "bbs點verybat點cn"

 

字符串的替換和截取功能在引用變量的地方均可以,並不一定必須要有set命令
@echo off
Set a=bbs.verybat.cn
Echo 替換前的值: "%a%"
Echo 替換后的值: "%a:.=點%"
Pause

 

2、字符串截取

截取功能語法格式為:%a:~[m[,n]]% 。方括號表示可選,%為變量標識符,a 為變量名,冒號用於分隔變量名和說明部分,~可以簡單理解為“偏移”,m為偏移量(缺省為0),n為截取長度(缺省為全部)

1)%PATH:~10,5% 就是顯示變量PATH里從 11位(偏移量 10)開始的 5 個字符! :

截取功能例子1:

@echo off

Set a=bbs.verybat.cn

Set var=%a:~1,2%

Echo %var%

Pause

執行結果只顯示為"bs"兩個字母。

2)%PATH:~-10%

截取功能例子2:

@echo off

Set a=bbs.verybat.cn

Set var=%a:~-3%

Echo %var%

Pause

運行結果:.cn

這個就是把變量a倒數3位的值給變量VAR

 

截取功能例子3:

@echo off

Set a=bbs.verybat.cn

Set var=%a:~3%

Echo %var%

Pause

運行顯示:.verybat.cn

這個就是把變量a的從第 3 位開始后面全部的值給變量VAR

 

3)%PATH:~0,-2%  

@echo off

Set a=bbs.verybat.cn

Set var=%a:~0,-3%

Echo %var%

Pause

運行顯示:bbs.verybat

這是把變量a的值從0位開始, 到倒數第三位之間的值全部賦予給var  

五、for命令詳解

1、基本格式

For %%variable IN (set) DO command [command-parameters]

參數:for有4 個參數  /d    /l    /r    /f   

  %%variable  可替換的參數。

  set指定一個或一組文件。可以使用通配符。 *號表示任意N 個字符,?號只表示任意一個字符

   Command    指定對每個文件執行的命令。

   Command-parameters  為特定命令指定參數或命令行開關。  

 

2/d  目錄搜索

FOR /D %%variable IN (set) DO command [command-parameters]

/d參數只能顯示當前目錄下的目錄名字,這個參數主要用於目錄搜索,不會搜索文件

1)@echo off

For /d %%i in (c:\*) do echo %%i

Pause

運行會把C盤根目錄下的全部目錄名字打印出來,而文件名字一個也不顯示!

2)@echo off

For /d %%i in (???) Do echo %%i

Pause

如果你當前目錄下有目錄名字只有1-3個字母的,就會顯示出來,沒有就不顯示了

 

3/R 文件搜素

FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]

檢查以 [drive:]path 為根的目錄樹,如果在/R后沒有指定目錄,則使用當前目錄。把當前或者你指定路徑下的文件名字全部讀取

@echo off

For /r c:\ %%i in (*.exe) do echo %%i

Pause

這個會把 C 盤根目錄,和每個目錄的子目錄下面全部的EXE文件都列出來!

 

4/L  數字序列

FOR /L %%variable IN (start,step,end) DO command [command-parameters]

使用迭代變量設置起始值 (Start#),然后以增量/減量形式逐步執行一組范圍的值,直到該值超過所設置的終止值 (End#)。

例如(1,1,5) 將產生序列1 2 3 4 5,(5,-1,1) 將產生 序列  (5 4 3 2 1)。

@echo off

For /l %%i in (1,1,5) do @echo %%i

Pause

保存執行看效果,他會打印從1 2 3 4 5  這樣5個數字

 

@echo off

For /l %%i in (1,1,5) do start cmd

Pause

執行后會打開5 個 CMD 窗口!

當然我們也可以把那個start cmd改成md %%i 這樣就會建立指定個目錄了!    

 

5/F  迭代及文件解析

“For /f”用來處理命令輸出、字符串及文件內容,delims負責切分字符串,而tokens負責提取字符串。
FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]
for /f "tokens=2 delims= " %%y IN ('adb shell "ps | grep com.tencent.mm"') do @set PID=%%

 

"options"包括一個或多個指定不同解析選項的關鍵字。這些關鍵字為:
Eol=c 一個行注釋字符的結尾(就一個)
Skip=n 在文件開始時忽略的行數。
Delims=xxx 分隔符集。這個替換了空格和跳格鍵的默認分隔符集。
Tokens=x,y,m-n 每行的哪一個符號被傳遞到每個迭代的 for 本身。

 

delims 中可以設置空格和其他字符做分隔符:
"delims=;, " 以分號,逗號,空格做分隔符。連着寫就行了,空格必須放最后。
分隔符有雙引號的話,表達式"delims=tokens="就得去掉前后的雙引號,寫成delims=tokens=,並且該表達式中的所有符號都要轉義,如:
for /f tokens^=1^,2^ delims^=^" %%a in (a.txt) do echo %%a %%b
(for中變量必須要用單個字母來表示,但只有一個寫在in前,有多個變量值時,變量值對應的賦值給該字母變量后面的字母變量)

 

@echo off

Rem 首先建立臨時文件test.txt

Echo ;注釋行,這是臨時文件,用完刪除 >test.txt

Echo 11段 12 段 13段 14段 15段 16段 >>test.txt

Echo 21段,22 段,23段,24段,25段,26段 >>test.txt

Echo 31段-32 段-33段-34段-35段-36段 >>test.txt

FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k

Pause

Del test.txt

運行顯示結果:

11段 13段 14段 15段 16 段

21段 23段 24段,25段,26 段

31段 33段 34段-35段-36 段

 

Eol=;          分號開頭的行為注釋行

Tokens=1,3*    將每行第1段,第3段和剩余字段分別賦予變量%%i,%%j,%%k

Delims=,-     (減號后有一空格)以逗號減號和空格為分隔符,空格必須放在最后

 

六、if命令

1、IF

IF 條件判斷語句有 3 種基本的用法,語法格式如下:
IF [NOT] ERRORLEVEL number command #如果返回值等於或大於指定數字,則執行命令
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command #如果指定的文件名存在,則執行命令

ELSE 子句必須在出現在 IF 之后的同一行上。例如:
IF EXIST filename (
Del filename
) ELSE (
Echo filename missing
)

2、IF [NOT] ERRORLEVEL number command

這個用法的基本做用是判斷上一條命令執行結果的返回值,以決定下一個步驟。
IF ERRORLEVEL這個句子必須放在某一個命令的后面,執行命令后由IF ERRORLEVEL 來判斷命令的返回值。
當使用 if errorlevel 0 …… 的句式時,它的含義是:如果錯誤碼的值大於或等於0的時候,將執行某個操作;
當使用 if %errorlevel%==0 …… 的句式時,它的含義是:如果錯誤碼的值等於 0 的時候,將執行某操作。

@echo off
net user
IF %ERRORLEVEL% == 0
echo net user 執行成功了!
Pause

這是個簡單判斷上條命令是否執行成功。一般上一條命令的執行結果代碼只有兩結果,"成功"用 0 表示   "失敗"用 1表示。實際上,errorlevel返回值可以在0~255之間

 

@echo off
Set /p var=請輸入命令:
%var%
If %ERRORLEVEL% == 0 (echo %var%執行成功了) ELSE echo %var%執行失敗了!
Pause

 

當然我門還可以把if else這樣的語句分成幾行寫出來:
@echo off
Set /p var=隨便輸入個命令:
%var%
If %ERRORLEVEL% == 0 (
Echo !Var! 執行成功了
) ELSE (
Echo 基本上執行失敗了..
)
Pause

 

3、IF [NOT] string1==string2 command

用來比較變量或者字符的值是不是相等的。但是你如果輸入相同的字符,但是如果其中一個后面打了一個空格, 這個例子還是會認為相等, 為了防止字符串中含有空格,可用以下格式

If [NOT] {string1}=={string2} command

If [NOT] [string1]==[string2] command

If [NOT] "string1"=="string2" command

 

IF [/I] string1 ==string2 command #參數/I表示不區分大小寫

@echo off
If /i a == A (echo 我們相等) ELSE echo 我們不相等
Pause
加上/I不區分大小寫就相等了!

 

 

4、IF [NOT] EXIST filename command

判斷某個文件或者文件夾是否存在,如果路徑有空格加個雙引號就不會出現判斷出錯了!

@echo off
If exist "c:\test" (echo 存在文件) else echo 不存在文件
Pause

批處理高級技巧

1、交互界面設計

看看高手設計的菜單界面吧:

@echo off

Cls

Title 終極多功能修復

Color 0A

Echo.

Echo               ================================

Echo               請選擇要進行的操作,然后按回車

Echo               ================================

Echo.

Echo               1.網絡修復及上網相關設置,修復IE,自定義屏蔽網站

Echo.

Echo               2.病毒專殺工具,端口關閉工具,關閉自動播放

Echo.

Echo               3.清除所有多余的自啟動項目,修復系統錯誤

Echo.

Echo               4.清理系統垃圾,提高啟動速度

Echo.

Echo               Q.退出

Echo.

Echo.

 

:cho

Set choice=

Set /p choice=請選擇:

IF NOT "%choice%"=="" SET choice=%choice:~0,1%

If /i "%choice%"=="1" goto ip

If /i "%choice%"=="2" goto setsave

If /i "%choice%"=="3" goto kaiji

If /i "%choice%"=="4" goto clean if /i "%choice%"=="Q" goto endd

Echo 選擇無效,請重新輸入

Echo.

Goto cho

  

2、循環語句

1、指定次數循環

FOR /L %variable IN (start,step,end) DO command [command-parameters]

組合命令:

FOR /L %variable IN (start,step,end) DO (

Command1

Command2

……

)  

3、條件循環

for命令循環有一個缺點,就是整個循環被當作一條命令語句,涉及到變量延遲的問題。 其實利用goto語句和條件判斷可以實現條件循環:  

@echo off

Set var=0

Rem ************循環開始了

:continue

Set /a var+=1

Echo 第%var%次循環

If %var% lss 100 goto continue

Rem ************循環結束了

Echo 循環執行完畢

Pause

 

@echo off

Set var=100

Rem ************循環開始了

:continue

Echo 第%var%次循環

Set /a var-=1

If %var% gtr 0 goto continue

Rem ************循環結束了

Echo 循環執行完畢

Pause  

 

3、子程序

在批處理程序中可以調用外部可運行程序,比如 exe 程序,也可調用其他批處理程序,這些也可以看作子程序,但是不夠方便。在 windows中,批處理可以調用本程序中的一個程序段,相當於子程序,這些子程序一般放在主程序后面。子過程一般放在最后,並且注意在主程序最后要加上exit或跳轉語句,避免錯誤的進入子過程。 子程序和主程序中的變量都是全局變量,其作用范圍都是整個批處理程序。傳至子程序的參數在 call 語句中指定,子程序返回主程序的數據只需在調用結束后直接引用就可以了,當然也可以指定返回變量,請看下面的例子。

子程序例1:
@echo off
Call :sub return 你好
Echo 子程序返回值:%return%
Pause

:sub
Set %1=%2
Goto :eof
運行結果:你好

 

子程序例2:
@echo off
call :sub return 你好
echo 子程序返回值:%return%
pause

:sub
set %1=%2
goto :eof
運行結果:你好


子程序例3:設計一個求多個整數相加的子程序
@echo off
set sum=0
call :sub sum 10 20 35
echo 數據求和結果:%sum%
pause

:sub
rem 參數1為返回變量名稱
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof
運行結果:65

 

4、將批處理轉化為可執行文件:

由於批處理文件是一種文本文件,任何人都可以對其進行隨便編輯,不小心就會把里面的命令破壞掉,所以如果將其轉換成.com格式的可執行文件,不僅執行效率會大大提高,而且不會破壞原來的功能,更能將優先級提到最高。Bat2Com 就可以完成這個轉換工作。 這是一個只有5.43K大小的免費綠色工具,可以運行在純DOS或DOS 窗口的命令行中,用法:Bat2Com Filename,這樣就會在同一目錄下生成一個名為 filenme.com 的可執行文件,執行的效果和原來的.bat文件一樣。

DOS環境下,可執行文件的優先級由高到低依次為.com>.exe>.bat>.cmd,即如果在同一目錄下存在文件名相同的這四類文件,當只鍵入文件名時,DOS執行的是name.com,如果需要執行其他三個文件,則必須指定文件的全名,如name.bat。

 

5、時間延遲

顧名思義就是執行一條命令后延遲一段時間再進行下一條命令。

1、利用ping 命令延時

  @echo off

  Echo 延時前:%time%

  Ping /n 3 127.0.0.1 >nul

  Echo 延時后:%time%

  Pause  

用到了 ping 命令的“/n”參數,表示要發送多少次請求到指定的 ip。本例中要發送 3 次請求到本機的Ip(127.0.0.1)。127.0.0.1 可簡寫為127.1。“>nul”就是屏蔽掉ping命令所顯示的內容。

 

2、利用for命令延時

  @echo off

  echo 延時前:%time%

  for /l %%i in (1,1,5000) do echo %%i>nul

  Echo 延時后:%time%

  Pause

原理很簡單,就是利用一個計次循環並屏蔽它所顯示的內容來達到延時的目的。

 

3、利用vbs延遲函數,精確度毫秒,誤差1000毫秒內

    @echo off

     echo %time%

     call :delay 5000

     echo %time%

     pause

     exit

     :delay

     echo wscript.Sleep %1>delay.vbs

     cscript //B delay.vbs

     del delay.vbs

     goto :eof

運行顯示:

10:44:06.45

10:44:11.95

請按任意鍵繼續. . .

上面的運行結果顯示實際延時了 5500 毫秒,多出來的 500 毫秒是建立和刪除臨時文件所耗費的時間。誤差在一秒之內。  

 

4、僅用批處理命令實現任意時間延遲,精確度10毫秒,誤差50毫秒內

@echo off

Set /p delay=請輸入需延遲的毫秒數:

Set totaltime=0

Set nowtime=%time%

::讀取起始時間,時間格式為:13:01:05.95

echo 程序開始時間:%nowtime%

:delay_continue

Set /a minute1=1%nowtime:~3,2%-100

::讀取起始時間的分鍾數

Set /a second1=1%nowtime:~-5,2%%nowtime:~-2%0-100000

::將起始時間的秒數轉為毫秒

Set nowtime=%time%

Set /a minute2=1%nowtime:~3,2%-100

:: 讀取現在時間的分鍾數

Set /a second2=1%nowtime:~-5,2%%nowtime:~-2%0-100000

::將現在時間的秒數轉為毫秒

Set /a totaltime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%

If %totaltime% lss %delay% goto delay_continue

Echo 程序結束時間:%time%

Echo 設定延遲時間:%delay%毫秒

Echo 實際延遲時間:%totaltime%毫秒

Pause

運行顯示:

   請輸入需延遲的毫秒數:6000

   程序開始時間:15:32:16.37

   程序結束時間:15:32:22.37

   設定延遲時間:6000毫秒

   實際延遲時間:6000毫秒

   請按任意鍵繼續. . .

首先設定要延遲的毫秒數,然后用循環累加時間,直到累加時間大於等於延遲時間。

 

為了方便引用,可將上面的例子改為子程序調用形式:

@echo off

Echo 程序開始時間:%Time%

Call :delay 10

Echo 實際延遲時間:%totaltime%毫秒

Echo 程序結束時間:%time%

Pause

Exit

::-----------以下為延時子程序--------------------

:delay

@echo off

If "%1"=="" goto :eof

Set delaytime=%1

Set totaltime=0

Set nowtime=%time%

::讀取起始時間,時間格式為:13:01:05.95

:delay_continue

Set /a minute1=1%nowtime:~3,2%-100

Set /a second1=1%nowtime:~-5,2%%nowtime:~-2%0-100000

Set nowtime=%time%

Set /a minute2=1%nowtime:~3,2%-100

Set /a second2=1%nowtime:~-5,2%%nowtime:~-2%0-100000

Set /a totaltime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%

If %totaltime% lss %delaytime% goto delay_continue

Goto :eof

6、模擬進度條

下面給出一個模擬進度條的程序。如果將它運用在你自己的程序中,可以使你的程序更漂亮。

@echo off

Mode con cols=113 lines=15 &color 9f

Echo.

Echo  程序正在初始化. . .   

Echo.

Set /p=■<nul

For /L %%i in (1 1 38) do set  /p a=■<nul&ping /n 1 127.0.0.1>nul

Echo    100%%

Pause

解說:

“set /p a=■<nul”的意思是:只顯示提示信息“■”且不換行,也不需手工輸入任何信息,這樣可以使每個“■”在同一行逐個輸出。

“ping /n 0 127.1>nul”是輸出每個“■”的時間間隔,即每隔多少時間輸出一個“■”。  

 

7、隨機數(%random%)的應用技巧

%RANDOM% 系統變量返回0 到32767之間的任意十進制數字。0~32767實際就是15位二進制數的范圍。那么,如何獲取100以內的隨機數呢?很簡單,將%RANDOM%按 100進行求余運算即可,見例子。

 

  @echo off

   Setlocal enabledelayedexpansion

   For /L %%i in (1 1 5) do (

      Set /a randomnum=!Random!%%100   :: 求余數運算%%

      Echo 隨機數:!randomnum!

   )

   Pause

運行結果:(每次運行不一樣)

隨機數:91

隨機數:67

隨機數:58

隨機數:26

隨機數:20

請按任意鍵繼續. . .

生成5 個 100以內的隨機數,求余數運算set /a randomnum=!Random!%%100中的100可以是 1~32768之間的任意整數。

 

@echo off

Call :randompassword 5 pass1 pass2

Echo %pass1% %pass2%   

Pause

Exit

:randompassword

::---------生成隨機密碼

::---------%1為密碼長度,%2 及以后為返回變量名稱

::---------for命令最多只能區分31個字段

@echo off

Set password_len=%1

If not defined password_len goto :eof

If %password_len% lss 1 goto :eof

Set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z

Set return= set num=0

:randompassword1

Set /a num+=1

Set /a numof=%random%%%26+1

For /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i

If %num% lss %password_len% goto randompassword1

If not "%2"=="" set %2=%return%

Shift /2

If not "%2"=="" goto randompassword

Goto :eof  

生成給定位數的隨機密碼,26個英文字母或10數字以及其它特殊字符組成一個字符串,隨機抽取其中的若干字符。

 

@echo off

Call :randompassword 6 pass1 pass2 pass3

Echo %pass1% %pass2% %pass3%

Pause

Exit

:randompassword

::---------生成隨機密碼

::---------%1為密碼長度,%2 及以后為返回變量名稱

::---------goto循環、變量嵌套、命令嵌套

@echo off

If "%1"=="" goto :eof

If %1 lss 1 goto :eof

Set password_len=%1

Set return=

Set wordset=abcdefghijklmnopqrstuvwxyz023456789_

::---------------------------循環

:randompassword1

Set /a numof=%random%%%36

Call set return=%return%%%wordset:~%numof%,1%%

Set /a password_len-=1

If %password_len% gtr 0 goto randompassword1

::---------------------------循環

If not "%2"=="" set %2=%return%

Shift /2

If not "%2"=="" goto randompassword

Goto :eof  

生成給定位數的隨機密碼,26個英文字母或10數字以及其它特殊字符組成一個字符串,隨機抽取其中的若干字符。 

 

8、注意點

先寫一個redis的開啟bat文件     redis-Start.bat

再寫一個redis的登陸bat文件   redis-login.bat

最后寫一個redis匯總啟動文件    Redis.bat

@echo off 
start /D "F:\批處理文件匯總" call redis-Start.bat
start /D "F:\批處理文件匯總" call redis-login.bat

參數D 后面的參數表示被調用命令的所在目錄。

 


免責聲明!

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



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