DOS 批處理
- 1. 基礎 DOS 命令
- 1.1 基礎命令
- 1.2 文件系統操作
- 1.3 文件夾管理
- 1.4 文件管理
- 1.5 網絡相關
- 1.6 系統管理
- 1.7 IF、FOR和NET
- IF
- FOR
- NET
1. 基礎 DOS 命令
command /? 查找幫助
- DOS命令不區分命令字母的大小寫
C:\Users\Administrator>echo 1
1
C:\Users\Administrator>echO 1
1
C:\Users\Administrator>EchO 1
- 腳本正常執行結束,返回值為0,異常結束,返回值為1或其它數字
1.1 基礎命令
REM 和 ::
ECHO 和 @
PAUSE
ERRORLEVEL
TITLE
COLOR
GOTO 和 :
FIND
START
assoc 和 ftype
pushd 和 popd
CALL
SHIFT
IF
setlocal 與 變量延遲
cls
FOR
-
REM
和::
指令有點類似我們C語言的注釋,但是有點不同。REM
注釋的描述,會在執行bat腳本的時候將描述回顯出來::
注釋的描述,在指令bat腳本時,不會將描述回顯。
d:\test_bat>type rem.bat rem rem line :: ::line pause d:\test_bat>rem.batd:\test_bat>rem rem lined:\test_bat>pause 請按任意鍵繼續. . .
-
ECHO除了可以打印我們想輸出的文字或者變量值的功能之外,還有一些小功能。
echo [on/off]:打開/關閉回顯功能 echo [context]:輸出提示信息 echo off:關閉DOS提示符的顯示,使屏幕只留下一個下劃線形狀的光標,再輸入echo on即可打開DOS提示符的顯示 echo.:輸出一個空行,這里的.和echo之間不要有空格,其實除了echo.有這個效果,echo+、echo-、echo*、echo,都可以 echo [文件內容] > [文件名]:建立新文件 echo [文件內容] >> [文件名]:新增文件內容
echo前面加@與否。 作用:加@代表不顯示當前行命令自身
示例:
G:\WorkSpaceG\yurq\dos>type echo.bat rem "echo off"指令關閉回顯 echo off echo "關閉回顯功能的效果" echo 床前明月光, echo 疑是地上霜, echo on echo "打開回顯功能的效果" echo 舉頭望明月, echo 低頭思故鄉. echo ---------------分割線------------- echo 建立新文件 :: 在當前路徑下新建文件 echo "hello" > ./new_file.txt echo "繼續增加文件內容,請按enter"&pause > nul echo 新增文件內容 echo "world" >> ./new_file.txt pauseG:\WorkSpaceG\yurq\dos>echo.batG:\WorkSpaceG\yurq\dos>rem "echo off"指令關閉回顯G:\WorkSpaceG\yurq\dos>echo off "關閉回顯功能的效果" 床前明月光, 疑是地上霜,G:\WorkSpaceG\yurq\dos>echo "打開回顯功能的效果" "打開回顯功能的效果"G:\WorkSpaceG\yurq\dos>echo 舉頭望明月, 舉頭望明月,G:\WorkSpaceG\yurq\dos>echo 低頭思故鄉. 低頭思故鄉.G:\WorkSpaceG\yurq\dos>echo ---------------分割線------------- ---------------分割線-------------G:\WorkSpaceG\yurq\dos>echo 建立新文件 建立新文件G:\WorkSpaceG\yurq\dos>echo "hello" 1>./new_file.txtG:\WorkSpaceG\yurq\dos>echo "繼續增加文件內容,請按enter" & pause 1>nul "繼續增加文件內容,請按enter"G:\WorkSpaceG\yurq\dos>echo 新增文件內容 新增文件內容G:\WorkSpaceG\yurq\dos>echo "world" 1>>./new_file.txtG:\WorkSpaceG\yurq\dos>pause 請按任意鍵繼續. . .G:\WorkSpaceG\yurq\dos>type new_file.txt "hello" "world"
-
ERRORLEVEL
ERRORLEVEL指令含義是“程序狀態返回碼”,返回上一條指令執行狀態碼,一般0
代表正常
,1或者其它數字
代表錯誤
-
TITLE
TITLE指令修改控制臺窗口的標題
-
color
設置默認的控制臺前景和背景顏色。COLOR [attr]attr 指定控制臺輸出的顏色屬性。
顏色屬性由兩個十六進制數字指定 – 第一個對應于背景,第二個對應于前景。每個數字可以為以下任何值:
0 = 黑色 8 = 灰色1 = 藍色 9 = 淡藍色2 = 綠色 A = 淡綠色3 = 淺綠色 B = 淡淺綠色4 = 紅色 C = 淡紅色5 = 紫色 D = 淡紫色6 = 黃色 E = 淡黃色7 = 白色 F = 亮白色
-
GOTO 和
:
GOTO 和:
指令含義就是跳轉的意思,那GOTO跳轉到哪里去呢?這里的GOTO是跳轉到標簽處,這里的標簽就是用:
來定義,標簽格式:[name]
,給標簽取名最好取一些有含義的名字D:\test_bat>type goto.bat @echo off :start set /a var +=1 echo var=%var% if %var% leq 4 goto start pauseD:\test_bat>goto.bat var=1 var=2 var=3 var=4 var=5 請按任意鍵繼續. . .
-
FIND
FIND指令,在文件
中搜索字符串FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]/V 顯示所有未包含指定字符串的行。/C 僅顯示包含字符串行的次數。/N 顯示行號。/I 搜索字符串時忽略大小寫。/OFF[LINE]:不要跳過具有脫機屬性集的文件。"string":指定要搜索的文本字符串。[drive:][path]filename:指定要搜索的文件
G:\WorkSpaceG\yurq\dos>type echo.bat @echo off echo "temp.txt文件內容" type .\temp.txt echo. echo "顯示所有未包含指定字符串的行" find /v "床" .\temp.txt echo ------------分割線-------------- echo "僅顯示包含字符串的行數" find /c "床" .\temp.txt echo ------------分割線-------------- echo "顯示行號" find /n "低頭" .\temp.txt echo ------------分割線-------------- echo "搜索字符串時忽略大小寫" find /i "hello world" .\temp.txt pauseG:\WorkSpaceG\yurq\dos>echo.bat "temp.txt文件內容" 床前明月光, 疑是地上霜, 舉頭望明月, 低頭思故鄉. HELLO WORLD hello worLD "顯示所有未包含指定字符串的行"---------- .\TEMP.TXT 疑是地上霜, 舉頭望明月, 低頭思故鄉. HELLO WORLD hello worLD ------------分割線-------------- "僅顯示包含字符串的行數"---------- .\TEMP.TXT: 1 ------------分割線-------------- "顯示行號"---------- .\TEMP.TXT [4]低頭思故鄉. ------------分割線-------------- "搜索字符串時忽略大小寫"---------- .\TEMP.TXT HELLO WORLD hello worLD 請按任意鍵繼續. . .
-
start
START指令,- 不帶參數,批處理中調用外部程序命令,該外部程序在新的窗口中運行,批處理程序繼續往下執行,不理會外部程序執行的情況。
- 使用
wait
參數,則必須等待外部程序完成后,輸入n
才可以繼續執行剩余的指令,輸入y
終止當前批處理后面的程序
echo off echo "start" :: start .\title.batecho "n"|start /wait .\title.bat echo "end"D:\test_bat>start.batD:\test_bat>echo off "start" ^C"end"
-
assoc 和 ftype
assoc
指令,顯示或設置“文件擴展名
”關聯到“文件類型
”;比如.txt文件擴展名,代表的是文本文件,執行“assoc .txt
”指令,即可看到輸出內容是“.txt=txtfile
”,及說明.txt文件擴展名代表著文本文件,再比如“assoc .doc
”指令,輸出內容是“.doc=Word.Document.8
”,及說明.doc文件擴展名代表著文檔文件ftype
指令,顯示或設置“文件類型
”關聯到“執行程序與參數
”;
D:\test_bat>@assoc .xlsx .xlsx=Excel.Sheet.12D:\test_bat>@assoc .txt .txt=txtfileD:\test_bat>assoc .doc .doc=Word.Document.8D:\test_bat>ftype txtfile txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1
-
pushd 和 popd
pushd 和 popd指令,切換保存的目錄d:\test_bat>pushd d:\test_batd:\test_bat>cd /d c:\c:\>popdd:\test_bat>
-
CALL
CALL指令可以在批處理執行過程中調用另外一個批處理程序,當另外一個批處理程序執行完后,再繼續執行原本的命令。
格式:CALL [drive:][path]filename [batch-parameters]
call與start不同的是call不會另外調用一個新的控制臺窗口來執行調用的批處理腳本
@echo off echo "調用修改控制臺標題腳本" call .\example_title.bat echo "調用程序執行完畢" pause
也可以調用自身腳本中的命令段,相當于調用子程序,但是被調用的命令段以標簽開始,以“
goto :eof
”結束
格式:CALL:label arguments
@echo off echo "這里是第一句話" call :sub_1 echo "這里是第三句話" echo "這里是第四句話" echo "這里是第五句話" pause:: --------子程序-------- :sub_1 echo "這里是第二句話" goto :eofG:\WorkSpaceG\yurq\dos>echo.bat "這里是第一句話" "這里是第二句話" "這里是第三句話" "這里是第四句話" "這里是第五句話" 請按任意鍵繼續. . . "這里是第二句話"
還是會額外執行子程序的內容
-
SHIFT
SHIFT指令更改批處理文件中可替換參數的位置,更改參數位置并不會影響%0和%1。格式:SHIFT [/n]
G:\WorkSpaceG\yurq\dos>type echo.bat @echo off ::在當前工作目錄下創建一個臨時文件 echo "這是一個臨時文件" > temp.txt call :sub 1 2 3 4 5 6 7 8 pause:sub echo 第二位參數的值:%~2 rem 向左移動一位 shift /1 echo 第二位參數的值:%~2 goto :eofG:\WorkSpaceG\yurq\dos>echo.bat 第二位參數的值:2 第二位參數的值:3 請按任意鍵繼續. . . 第二位參數的值: 第二位參數的值:
-
setlocal 與 變量延遲
批處理讀取命令是按行讀取,在處理之前要完成必要的預處理工作,這其中就包括對命令中變量復賦值。我們看個例子來理解變量延遲d:\test_bat>type start.bat @echo off set a=4 set a=5 & echo %a% paused:\test_bat>start.bat 4 請按任意鍵繼續. . .
這里我們可以看到輸出的結果是4,這是為什么呢?前面不是說了嗎,批處理讀取命令是按行讀取,在處理之前要完成必要的預處理工作,這其中就包括對命令中變量復賦值,a被我賦值了4,我們下一行不是給a賦值了5嗎,為什么不是5呢,“set a=5 & echo %a%”的意思是:我們打印a的值時與給a賦值5的命令是
同時執行
的,正因為是同時執行的,所以批處理無法感知變量的動態變化。為了感知動態變化,批處理設計了變量延遲,簡單來說,在讀取一條完整的語句之后,不立即對該行的變量賦值,而會在某個單條語句執行之前再進行賦值,也就是說”延遲“了對變量的賦值。對示例1開啟變量延遲d:\test_bat>type start.bat @echo off setlocal enabledelayedexpansion set a=4 set a=5 & echo !a! paused:\test_bat>start.bat 5 請按任意鍵繼續. . .
變量延遲的啟動語句是”
setlocal enabledelayedexpansion
“,并且變量要用一對”!!
“將變量括起來,否則就沒有變量延遲的效果為什么要用變量延遲?
d:\test_bat>type start.bat @echo off ::setlocal enabledelayedexpansion for /l %%i in (1, 1, 5) do (set a=%%iecho %a% ) paused:\test_bat>start.bat 5 5 5 5 5 請按任意鍵繼續. . .
d:\test_bat>type start.bat @echo off setlocal enabledelayedexpansion for /l %%i in (1, 1, 5) do (set a=%%iecho !a! ) paused:\test_bat>start.bat 1 2 3 4 5 請按任意鍵繼續. . .
1.2 文件系統操作
vol 顯示磁盤卷標號label 創建更改或刪除磁盤的卷標
更改卷標
C:\Users\Administrator>cd /d d:/d:\>label soft
1.3 文件夾管理
cdmd/mkdirrd/rmdirdirtreepath 顯示path的環境變量值XCOPY source [destination] 復制文件和目錄樹
1.4 文件管理
type 顯示文件內容copy source [destination] 將一份或多份文件復制到另一個位置del/erasemoveren/renamereplace 替換文件attrib 顯示或更改文件屬性find 在文件中搜索字符串fc 比較兩個文件或兩個文件集并顯示它們之間的不同
# replace 如果目標目錄沒有此文件,不進行替換
d:\>replace d:\1\123 d:\2
正在替換 D:\2\123# attrib
d:\>attrib /?
顯示或更改文件屬性。ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [+O | -O] [+I | -I] [+X | -X] [+P | -P] [+U | -U][drive:][path][filename] [/S [/D]] [/L]+ 設置屬性。- 清除屬性。R 只讀文件屬性。A 存檔文件屬性。S 系統文件屬性。H 隱藏文件屬性。# find
d:\>find "123" 123---------- 123
123# fc
d:\>fc 123 d:\1\123
正在比較文件 123 和 D:\1\123
FC: 找不到差異
1.5 網絡相關
pingftp 將文件傳送到運行 FTP 服務器服務(經常稱為后臺程序)的計算機以及將文件從該計算機傳出。可以交互使用 Ftpnet 網絡相關telnet 檢測服務器的端口是否開放,telnet www.baidu.com 80ipconfigmsg 將消息發送給用戶arp 顯示和修改地址解析協議(ARP)使用的“IP 到物理”地址轉換表,arp是地址解析協議,其基本功能為透過目標設備的IP地址,查詢目標設備的MAC地址,以保證通信的順利進行。它是IPv4中網絡層必不可少的協議,不過在IPv6中已不再適用,并被鄰居發現協議(NDP)所替代。nslookup 查詢域名對應的IP地址tracert ip/域名 路由追蹤命令
# ftp
FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-x:sendbuffer] [-r:recvbuffer] [-b:asyncbuffers] [-w:windowsize] [host]-v 禁止顯示遠程服務器響應。-n 禁止在初始連接時自動登錄。-i 關閉多文件傳輸過程中的交互式提示。-d 啟用調試。-g 禁用文件名通配(請參閱 GLOB 命令)。-s:filename 指定包含 FTP 命令的文本文件;命令在 FTP 啟動后自動運行。-a 在綁字數據連接時使用所有本地接口。-A 匿名登錄。-x:send sockbuf 覆蓋默認的 SO_SNDBUF 大小 8192。-r:recv sockbuf 覆蓋默認的 SO_RCVBUF 大小 8192。-b:async count 覆蓋默認的異步計數 3-w:windowsize 覆蓋默認的傳輸緩沖區大小 65535。host 指定主機名稱或要連接到的遠程主機的 IP 地址。
1.6 系統管理
schtasksshutdowntskilltaskkilltasklistscregpowercfg
1.7 IF、FOR和NET
由于這幾個命令比較常用且復雜,所以單獨整理,這幾個命令之間沒有必然聯系。
IF
執行批處理程序中的條件處理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename commandNOT 指定只有條件為 false 的情況下,Windows 才應該執行該命令。ERRORLEVEL number 如果最后運行的程序返回一個等于或大于指定數字的退出代碼,指定條件為 true。string1==string2 如果指定的文字字符串匹配,指定條件為 true。EXIST filename 如果指定的文件名存在,指定條件為 true。command 如果符合條件,指定要執行的命令。如果指定的條件為 FALSE,命令后可跟 ELSE 命令,該命令將在 ELSE 關鍵字之后執行該命令。
ELSE 子句必須出現在同一行上的 IF 之后。例如:
IF EXIST filename. (del filename.) ELSE (echo filename. missing.)
由于 del 命令需要用新的一行終止,因此以下子句不會有效:
IF EXIST filename. del filename. ELSE echo filename. missing
由于 ELSE 命令必須與 IF 命令的尾端在同一行上,以下子句也不會有效:
IF EXIST filename. del filename.ELSE echo filename. missing
如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing
d:\test_bat>if 1 leq 1 echo 123
123d:\test_bat>if errorlevel 0 echo 321
321d:\test_bat>if exist start.bat echo exist
exist
如果命令擴展被啟用,IF 會如下改變:
IF [/I] string1 compare-op string2 commandIF CMDEXTVERSION number commandIF DEFINED variable command
其中, compare-op 可以是:
EQU - 等于NEQ - 不等于LSS - 小于LEQ - 小于或等于GTR - 大于GEQ - 大于或等于
而/I
開關(如果指定)說明要進行的字符串比較不分大小寫
。/I 開關可以用于 IF 的 string1==string2 的形式上。這些比較都是通用的;原因是,如果 string1 和 string2 都是由數字組成的,字符串會被轉換成數字,進行數字比較。
CMDEXTVERSION
條件的作用跟 ERRORLEVEL
的一樣,除了它是在跟與命令擴展有關聯的內部版本號比較。第一個版本是 1。每次對命令擴展有相當大的增強時,版本號會增加一個。命令擴展被停用時,CMDEXTVERSION 條件不是真的。
如果已定義環境變量,DEFINED
條件的作用跟 EXIST 的一樣,除了它取得一個環境變量,返回的結果是 true。
如果沒有名為 ERRORLEVEL 的環境變量,%ERRORLEVEL%會擴充為 ERROLEVEL 當前數值的字符串表達式;否則,你會得到其數值。運行程序后,以下語句說明 ERRORLEVEL 的用法:
goto answer%ERRORLEVEL%:answer0echo Program had return code 0:answer1echo Program had return code 1
你也可以使用以上的數字比較:
IF %ERRORLEVEL% LEQ 1 goto okay
如果沒有名為 CMDCMDLINE
的環境變量,%CMDCMDLINE%將在 CMD.EXE 進行任何處理前擴充為傳遞給 CMD.EXE 的原始命令行;否則,你會得到其數值。
如果沒有名為 CMDEXTVERSION
的環境變量,%CMDEXTVERSION% 會擴充為 CMDEXTVERSION 當前數值的字串符表達式;否則,你會得到其數值。
其實筆者整理這篇文章就是因為
if 1 echo 1
報錯,現在看來確實是語法錯誤
FOR
對一組文件中的每一個文件執行某個特定命令。
- 基本格式:
FOR %variable IN (set) DO command [command-parameters]%variable 指定一個單一字母可替換的參數。(set) 指定一個或一組文件。可以使用通配符。command 指定對每個文件執行的命令。command-parameters為特定命令指定參數或命令行開關。在批處理程序中使用 FOR 命令時,指定變量請使用 %%variable而不要用 %variable。變量名稱是區分大小寫的,所以 %i 不同于 %I.
FOR命令有4個參數“/D、/L、/R、/F
”
- FOR參數
- <1> 參數
/D
詳解
定義:FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件名匹配
解析:如果集合(set)包含通配符(“*”和“?”),將對與集合(set)相匹配的每一個目錄(不是指目錄中的文件組)執行指定的Commoand,這個參數主要用于目錄搜索,不會搜索文件
D可以理解為Directory
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo C盤根目錄下所有目錄名:
for /d %%i in (c:\*) do (echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
C盤根目錄下所有目錄名:
c:\Intel
c:\PerfLogs
c:\Program Files
c:\Program Files (x86)
c:\Python27
c:\Temp
c:\Users
c:\Windows
請按任意鍵繼續. . .
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 當前目錄下所有目錄名:
for /d %%i in (%~dp0*) do (echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
當前目錄下所有目錄名:
G:\WorkSpaceG\yurq\dos\123
請按任意鍵繼續. . .
- <2> 參數
/R
詳解
定義:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的 FOR 語句。
如果在 /R 后沒有指定目錄規范,則使用當前目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹
解析:通過/D參數知道,/D參數能顯示指定路徑或者當前路徑下的目錄名,/R也是跟目錄有關,/R參數可以把指定路徑下或者當前目錄下的文件名全部讀取,注意是文件名,不是目錄名
注意:
1、集合(set)中文件名如果包含通配符(“*”和“?”),則列舉/R參數指定的目錄及其下面的所有子目錄中與集合(set)相符合的所有文件,不相符文件的目錄則不列舉
2、如果集合(set)中為具體文件名,不包含通配符,則枚舉該目錄樹(即枚舉該目錄及其下面的所有子目錄),而不管集合(set)中指定文件是否存在。這與前面所說的單點(.)枚舉目錄樹是一個道理,單點代表當前目錄,也可視為一個文件
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 搜索D盤根目錄和子目錄子所有以.bat結尾的文件:
for /r c:\ %%i in (*.bat) do (echo %%i
)
echo --------------------------------------------
echo 搜索當前目錄及其子目錄下所有以.txt結尾的文件:
for /r %%i in (*.txt) do (echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
搜索C盤根目錄和子目錄子所有以.bat結尾的文件:
c:\$WINDOWS.~BT\NewOS\Program Files\WindowsPowerShell\Modules\Pester\3.4.0\Build.bat
c:\$WINDOWS.~BT\NewOS\Program Files\WindowsPowerShell\Modules\Pester\3.4.0\bin\Pester.bat
c:\$WINDOWS.~BT\NewOS\Program Files (x86)\Microsoft\Edge\Application\92.0.902.67\show_third_party_software_licenses.bat
...
@echo off
echo 在C盤中搜索具體文件名為“temp.png”:
for /r c:\ %%i in (temp.png) do (echo %%i
)
pause
備注:如果集合(set)中為具體文件名,不包含通配符,則枚舉該目錄樹(即枚舉該目錄及其下面的所有子目錄),而不管集合(set)中指定文件是否存在。什么意思呢,就是它會搜索C盤中一切可能有“temp.png”文件的路徑,不管“temp.png”存在都會給出一個路徑結果
擴展:你可以將上方腳本修改為下面這種,看是否真的存在
G:\WorkSpaceG\yurq\dos>echo.bat
在C盤中搜索具體文件名為“temp.png”:
請按任意鍵繼續. . .G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 在C盤中搜索具體文件名為“temp.png”:
for /r c:\ %%i in (temp.png) do (if exist %%i echo %%i
)
pause
- <3> 參數
/L
詳解
定義:FOR /L %variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結束的一個數字序列。因此,(1,1,5)
將產生序列1 2 3 4 5
,(5,-1,1)將產生序列(5 4 3 2 1)
解析:使用迭代變量設置起始值(start),然后逐步執行一組范圍值,直到該值超過所設置的終止值(end)。/L
參數將通過對起始值與終止值進行比較來執行迭代變量,如果起始值小于終止值,就會執行指定給出的命令,如果迭代變量超過終止值,則命令解釋程序退出循環。可以使用負的步進值(step)以遞減數值的方式來逐步執行此范圍內的值
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 正的步進值(step)循環結果:
for /l %%i in (1, 1, 5) do (echo %%i
)
echo --------------------------------------------
echo 負的步進值(step)循環結果:
for /l %%i in (5, -1, 1) do (echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
正的步進值(step)循環結果:
1
2
3
4
5
--------------------------------------------
負的步進值(step)循環結果:
5
4
3
2
1
請按任意鍵繼續. . .
這個參數的for,用起來和其他編程語言的for含義相似
- <4> 參數 /F詳解
定義:
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]
或者,如果有 usebackq
選項:
FOR /F ["usebackq options"] %variable IN (file-set) DO command [command-parameters]FOR /F ["usebackq options"] %variable IN ('string') DO command [command-parameters]FOR /F ["usebackq options"] %variable IN (`command`) DO command [command-parameters]
file-set 為一個或多個文件名。繼續到 file-set 中的下一個文件之前,每份文件都被打開、讀取并經過處理。處理包括讀取文件,將其分成一行行的文字,然后將每行解析成零或更多的符號。然后用已找到的符號字符串變量值調用 For 循環。以默認方式,/F 通過每個文件的每一行中分開的第一個空白符號。跳過空白行。你可通過指定可選 “options
” 參數替代默認解析操作。這個帶引號的字符串包括一個或多個指定不同解析選項的關鍵字。這些關鍵字為:
eol=c - 指一個行注釋字符的結尾(就一個)skip=n - 指在文件開始時忽略的行數。delims=xxx - 指分隔符集。這個替換了空格和制表符的默認分隔符集。tokens=x,y 或 m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變量名稱的分配。m-n格式為一個范圍。通過 nth 符號指定 mth。如果符號字符串中的最后一個字符星號,那么額外的變量將在最后一個符號解析之后usebackq - 指定新語法已在下類情況中使用:在作為命令執行一個后引號的字符串并且一個單引號字符為文字字符串命令并允許在 file-set中使用雙引號擴起文件名稱。
注意:tokens= 一行指定最多 26 個符號,只要不試圖聲明一個高于字母 “z” 或"Z" 的變量。請記住,FOR 變量是單一字母、分大小寫和全局的變量;而且,不能同時使用超過 52 個
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
rem 創建測試文件
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
echo 第一句話 > .\temp.txt
echo 第二句話 >> .\temp.txt
echo 第三句話 >> .\temp.txt
echo hello;world >> .\temp.txt
echo -------------------------------------------------------------
echo /F參數解析文件內容:
for /f "eol=; tokens=1,3* delims=,- " %%i in (.\test.txt) do (echo %%i %%j %%k
)
echo -------------------------------------------------------------
echo /F參數解析字符串:
for /f "tokens=1,2,3 delims=,-;" %%i in ("hello,world-window;bat") do (echo 第一列字符串:%%i;第二列字符串:%%j;第三列字符串:%%k
)
echo -------------------------------------------------------------
echo temp.txt文件內容:
type .\temp.txt
echo -------------------------------------------------------------
echo /F參數解析命令:
rem 結果輸出只顯示最左側的“hello”,因為tokens沒有設置,所以只顯示第一列
for /f "skip=3 delims=; " %%i in ('type .\temp.txt') do (echo %%i
)
pause
del .\test.txt & del .\temp.txt
G:\WorkSpaceG\yurq\dos>echo.bat
-------------------------------------------------------------
/F參數解析文件內容:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
-------------------------------------------------------------
/F參數解析字符串:
第一列字符串:hello;第二列字符串:world;第三列字符串:window
-------------------------------------------------------------
temp.txt文件內容:
第一句話
第二句話
第三句話
hello;world
-------------------------------------------------------------
/F參數解析命令:
hello
請按任意鍵繼續. . .
解析:
“eol=c”指定單個字符作為注釋行的開頭;
“skip=n”指定忽略前n行;
“delims=xxx”指定分隔符,將內容按照指定分隔符進行分割;
“tokens=x,y,m-n”指定分割后的內容將按照“x,y,m-n”列顯示內容(比如“tokens=1,2,3”顯示分割后的第一列、第二列、第三列內容;而“tokens=1,3*”顯示分割后的第一列、第三列、第三列后的內容當作一列內容)
“usebackq options”
對于帶有空格的文件名,你需要用雙引號將文件名括起來。為了用這種方式來使用雙引號,還需要使用 usebackq 選項,否則,雙引號會被理解成是用作定義某個要分析的字符串。
即被雙引號括起來的字符串,此選項都認為是文件名
單引號括起來為“字符串”
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
rem 創建測試文件
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
echo 第一句話 > .\temp.txt
echo 第二句話 >> .\temp.txt
echo 第三句話 >> .\temp.txt
echo hello;world >> .\temp.txt
echo -------------------------------------------------------------
echo /F參數解析文件內容:
for /f "usebackq eol=; tokens=1,3* delims=,- " %%i in (.\test.txt) do (echo %%i %%j %%k
)
echo -------------------------------------------------------------
echo /F參數解析字符串:
for /f "usebackq tokens=1,2,3 delims=,-;" %%i in ('hello,world-window;bat') do (echo 第一列字符串:%%i;第二列字符串:%%j;第三列字符串:%%k
)
echo -------------------------------------------------------------
echo temp.txt文件內容:
type .\temp.txt
echo -------------------------------------------------------------
echo /F參數解析命令:
for /f "usebackq skip=3 delims=; " %%i in (`type .\temp.txt`) do (echo %%i
)
pause
del .\test.txt & del .\temp.txt
G:\WorkSpaceG\yurq\dos>echo.bat
-------------------------------------------------------------
/F參數解析文件內容:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
-------------------------------------------------------------
/F參數解析字符串:
第一列字符串:hello world;第二列字符串:window bat;第三列字符串:
-------------------------------------------------------------
temp.txt文件內容:
第一句話
第二句話
第三句話
hello;world
-------------------------------------------------------------
/F參數解析命令:
hello
請按任意鍵繼續. . .
- FOR命令中的變量
變量(I ) | 說明 |
---|---|
%~I | 刪除任何引號("),擴展 %I,刪除引號規則為:無頭不刪,有頭連尾刪 |
%~fI | 將 %I 擴展到一個完全合格的路徑名 |
%~dI | 僅將 %I 擴展到一個驅動器號 |
%~pI | 僅將 %I 擴展到一個路徑 |
%~nI | 僅將 %I 擴展到一個文件名 |
%~xI | 僅將 %I 擴展到一個文件擴展名 |
%~sI | 擴展的路徑只含有短名 |
%~aI | 將 %I 擴展到文件的文件屬性 |
%~tI | 將 %I 擴展到文件的日期/時間 |
%~zI | 將 %I 擴展到文件的大小 |
%~$PATH:I | 查找列在路徑環境變量的目錄,并將 %I 擴展到找到的第一個完全合格的名稱。如果環境變量名未被定義,或者沒有找到文件,此組合鍵會擴展到空字符串 |
另外,還可以組合修飾符來得到多重結果:
變量(I ) | 說明 |
---|---|
%~dpI | 僅將 %I 擴展到一個驅動器號和路徑 |
%~nxI | 僅將 %I 擴展到一個文件名和擴展名 |
%~fsI | 僅將 %I 擴展到一個帶有短名的完整路徑名 |
%~dp$PATH:I | 搜索列在路徑環境變量的目錄,并將 %I 擴展到找到的第一個驅動器號和路徑。 |
%~ftzaI | 將 %I 擴展到類似輸出線路的 DIR |
NET
顯示所有用戶賬號(net user)
添加用戶賬戶(net user username /add)
刪除指定用戶賬戶(net user username /delete)
激活或禁用指定賬戶(net user username /active:yes/no)
查詢賬戶相關的安全信息(net accounts)
查詢共享資源(net view、net file、net share)
- 局域網內共享的計算機——net view
- 查詢遠端計算機正在占用的共享文件——net file
- 查詢、管理共享文件夾——net share,例如
- 我要設置e盤為共享文件夾,可以執行命令【
net share e=e:\
】,其中第一個e代表了共享文件夾的名稱,而e:\代表的是共享文件夾的目錄路徑。 - 刪除共享文件夾的設定,【
net share D:\D-desktop\test5 /delete
】
- 我要設置e盤為共享文件夾,可以執行命令【
服務管理(net start、net stop、Net Pause、Net Continue)
- 查詢已經開啟了哪些服務——net start,執行沒有參數的命令【
net start
】,可以查看當前已經開啟的服務。這些服務也可在服務管理器查看,在運行窗口或cmd窗口中執行命令【services.msc
】,可以看到所有服務。 - 暫停某項服務——net stop xxx,假如說我們想暫停上面的第一項服務,可以執行命令【
net stop "ABBYY FineReader 15 Licensing Service"
】成功暫停。 - 啟動某項服務——net start xxx,當我們想要啟動那個被我們終止的ABBYY服務時,可以用命令【
net start "ABBYY FineReader 15 Licensing Service"
】。
賬號信息(net user、net localgroup)
net user
命令用于添加或更改用于賬號或顯示用戶賬號信息。此命令也可以寫為“net users”,格式【net user[username [password | *] [options] ] [/domain]
】,username 用于添加、刪除、更改或查看用戶的賬號名C:\Users\Administrator>net user gtt gtt123 /add 命令成功完成。 C:\Users\Administrator>net user gtt /delete 命令成功完成。
net localgroup
此命令和net user命令配合使用,用于添加用戶,提升用戶為管理員。 在滲透測試中,提權是要掌握的基本知識。【net localgroup groupname {/add [/comment:"text"] | /delete} [/domain]
】
計算機連接情況(net use)
“Net USE”命令用于查看連接的計算機,斷開計算機與共享資源的連接,或者顯示計算機的連接信息,【net use [devicename | *] [ computernamesharename[volume]] [password | *]] [/user :[domainname] username] [[/delete] | [/persistent:{yes | no}]]
】
“devicename”"用于指定要連接的資源名稱或要斷開的設備名稱。
“computernamesharename” 表示服務器及共享資源的名稱。
'password” 表示訪問共享資源的密碼。
“/user”用于指定進行連接的另外一個用戶。
*domainname” 用于指定另一個域。
username ”用于指定登錄的用戶名。
“/home”用于將用戶連接到其宿主目錄。
“/delete"用于取消指定的網絡連接。
“/persistent"用于控制永久網絡連接的使用。
net use * /delete /Y
net use gtt gtt123 /user:\\192.168.2.151\abc
同步時間
net time
此命令用于查看系統時間,使計算機的時鐘與另一臺計算機或域的時鐘同步,命令格式如下。
net time [computername | /domain [:name]] [/set]
“computername” 表示要檢查或同步的服務器名。
“/domain[:name]”用于指定要與其時間同步的域。
“/set"用于使本計算機時鐘與指定計算機或域的時鐘同步。
會話管理
net session
命令用于列出或斷開本地計算機與之連接的客戶端的會話,也可寫為 net sessions
或 net sess
命令格式 net session [computername] [/delete]