常用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,是暫停的意思 就是停止系統命令的執行並顯示 “請按任意鍵繼續. . .”
4、title 設置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 后面的參數表示被調用命令的所在目錄。