window的dos命令學習筆記 四

一、dos歷史學習筆記(後期整合到這裏)

這個是我所以的dos學習筆記,希望對感興趣的你有所幫助,如有錯誤,還望不吝賜教。如果對你有幫助,希望給我點個贊哈,Thanks♪(・ω・)ノ

學習主要還是靠堅持,如果真的覺得學一個知識,就堅持下去;三天打魚倆天曬網,真的不如躺着歇,刷刷劇,或者玩倆局遊戲。。。

window的dos命令學習筆記 一

window的dos命令學習筆記 二

window的dos命令學習筆記 三

window的dos命令學習筆記 四

window的dos命令學習筆記 五

window的dos命令學習筆記 六

window的dos命令學習筆記 七

window的dos命令學習筆記 八— bat文件打包成exe程序(實現腳本加密)

window的dos命令學習筆記 九— bat使用小工具

二、語句結構:

類似於C語言,批處理也有它的語句結構。批處理的語句結構主要有選擇結構(if語句)、循環結構(for語句)等。
今天開始學習一下語句結構。

1、if條件語句(選擇結構)

if語句實現條件判斷,包括字符串比較、存在判斷、定義判斷等。通過條件判斷,if語句即可以實現選擇功能。

官方說明:

E:\000dos\4筆記四>if /?
執行批處理程序中的條件處理。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

  NOT               指定只有條件爲 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

如果命令擴展被啓用,IF 會如下改變:

    IF [/I] string1 compare-op string2 command
    IF CMDEXTVERSION number command
    IF 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%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

你也可以使用以上的數字比較:

    IF %ERRORLEVEL% LEQ 1 goto okay

如果沒有名爲 CMDCMDLINE 的環境變量,%CMDCMDLINE%
將在 CMD.EXE 進行任何處理前擴充爲傳遞給 CMD.EXE 的原始
命令行;否則,你會得到其數值。

如果沒有名爲 CMDEXTVERSION 的環境變量,
%CMDEXTVERSION% 會擴充爲 CMDEXTVERSION 當前數值的
字串符表達式;否則,你會得到其數值。

示例:

if else語句的倆種寫法:

法一:倆行(else和if各一行)

IF EXIST filename. del filename.
ELSE echo filename. missing

發二:如果都放在同一行上,以下子句有效:(if成功之後,後面的語句用括號括起來,如果裏面多個批命令,還是分開各佔一行執行,不然還是報錯。)

IF EXIST filename. (del filename.) ELSE echo filename. missing

1)、字符串比較

if語句僅能夠對兩個字符(串)是否相同、先後順序進行判斷等。其命令格式爲:

IF [/I] [not] string1 compare-op string2 command1 [else command2]

其中,比較操作符compare-op有以下幾類:

== - 等於
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於

選擇參數/i則不區分字符串大小寫;選擇not項,則對判斷結果進行邏輯非。
字符串比較示例:

1、獲取日期和時間的字符

E:\000dos\4筆記四>echo %date%
2019/12/17 週二

E:\000dos\4筆記四>echo %time%
10:55:14.26

2、pause 和 pause>nul的區別
pause 等待並顯示漢字:請按任意鍵繼續. . .
pause>nul等待不顯示任何漢字。


E:\000dos\4筆記四>pause>nul

E:\000dos\4筆記四>pause
請按任意鍵繼續. . .

3、字符串的比較(字符串是從第一個字符的大小依次往後開始比較):

敲入代碼:

@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)

set str3=Zabcd12334
set str4=ABCD1234
if /i %str3% LSS %str4% (echo %str3%^<%str4%) else (echo %str3%^>=%str4%)
echo.
set /p choice=是否顯示當前時間?(y/n)
if /i not %choice% EQU n echo 當前時間是:%date% %time%
pause

執行結果:
在這裏插入圖片描述

4、數字的比較

代碼:

@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)

set str3=12334
set str4=1234
if  %str3% LSS %str4% (echo %str3%^<%str4%) else (echo %str3%^>=%str4%)
echo.
set /p choice=是否顯示當前時間?(y/n)
if /i not %choice% EQU n echo 當前時間是:%date% %time%
pause

執行效果:
在這裏插入圖片描述
5、忽略字符串大小寫:
代碼:

@echo off
set str1=abcd1234
set str2=ABCD1234
if /i %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
pause

執行結果:
在這裏插入圖片描述

2)、存在判斷

存在判斷的功能是判斷文件或文件夾是否存在。其命令格式爲:
這個我感覺可以用來做一些批量刪除文件和文件夾或者創建文件夾時使用,md、del、結合執行效果比較好。

IF [NOT] EXIST filename command1 [else command2]

1、判斷執行的文件是否存在:

@echo off
if exist %0 echo 文件%0是存在的!
if not exist %~df0 (echo 文件夾%~df0不存在!)  else  (echo 文件夾%~df0存在!)
pause>nul

這裏注意幾個地方:

  1. 存在判斷既可以判斷文件也可以判斷文件夾;
  2. %0即代表該批處理的全稱(包括驅動器盤符、路徑、文件名和擴展類型);
  3. %~df0是對%0的修正,只保留了其驅動器盤符和路徑,詳情請參考for /?,屬高級批處理範疇;
  4. 注意if語句的多行書寫,多行書寫要求command1的左括號必須和if在同一行、else必須和command1的右括號同行、command2的左括號必須與else同行、command1和command2都可以有任意多行,即command可以是命令集。

3)、定義判斷

定義判斷的功能是判斷變量是否存在,即是否已被定義。其命令格式爲:

IF [not] DEFINED variable command1 [else command2]

存在判斷舉例:

@echo off
set var=111
if defined var (echo var=%var%) else (echo var尚未定義!)
set var=
if defined var (echo var=%var%) else echo var尚未定義!
pause

執行結果:
在這裏插入圖片描述
對比可知,"set var="可以取消變量,收回變量所佔據的內存空間。

4)、使用if寫一個成績分類

當然,這個成績分類使用python和shell都可以很簡單寫出來,我就獻醜了。

代碼:
寫了好久,總數寫出來了,主要還是語法有區別,比如我吧
(%score% LSS 0) & (%score% GTR 100)放在一起,卻給我提示沒有識別&,不知道什麼鬼,只能後面慢慢學習了。

@echo off
set /p score=請輸入成績
rem 用來判斷是否格式正確
if %score% LSS 0 (
echo "輸入的成績分數不對(分數0-100之間)" 
pause
call exit
) 

if %score% GTR 100 (
echo "輸入的成績分數不對(分數0-100之間)" 
pause
call exit
) 

if %score% GTR 90 (
echo "優秀" 
call pause
call exit
)

if %score% GTR 80 (
echo "良好" 
call pause
call exit
)

if %score% GTR 70 (
echo "中等" 
call pause
call exit
)

if %score% GTR 60 (
echo "及格" 
call pause
call exit
)
if (%score% LSS 60) (
echo "不及格" 
call pause
call exit
)

注意點:

  1. if成功之後,後面的小括號裏面的語句,必須單個命令佔一行,我也是嘗試好多次才發現這樣才能運行多個語句,我想用&&連在一起卻不行,至於原因我也不知道,有懂的歡迎下方留言指教指教。
  2. 直接執行exit 不會退出,還會接着往下執行,需要加call。比如:call exit。我發現pause和exit如果想一起用目前我只到就只能這樣用,單寫一個是可以的,pause可以不加call是沒有問題的,但是退出的exit必須加上call。

5)、優化下成績分類

不知道看到我這裏你有沒有想到一個優化我的第四個代碼,就是如果小於0或者大於100時直接退出,如何寫一個循環,讓再次輸入,這個是個很好思路,第一次我想到是python的while True(受python的影響,但是dos可沒有找到這個命令),後來想到goto,不知道看到這裏你還有沒有印象,有的話自己去看看我的之前博客寫的goto的用法。

優化的代碼:

@echo off
:return1
set score=
set /p score=請輸入成績
rem 用來判斷是否格式正確
if %score% LSS 0 (
echo "輸入的成績分數不對:%score%(分數0-100之間),請再次輸入:" 
goto return1
) 
if %score% GTR 100 (
echo "輸入的成績分數不對:%score%(分數0-100之間),請再次輸入:" 
goto return1
) 
if %score% GTR 90 (
echo "優秀" 
call pause
call exit
)

if %score% GTR 80 (
echo "良好" 
call pause
call exit
)

if %score% GTR 70 (
echo "中等" 
pause
call exit
)

if %score% GTR 60 (
echo "及格" 
call pause
call exit
)
if (%score% LSS 60) (
echo "不及格" 
call pause
call exit
)

執行效果:

在這裏插入圖片描述

這裏我又遇到一個問題,就是前面判斷是否小於0或者大於100的時候,前面語句帶小括號會出問題,但是下面的用來判斷小於60不及格的時候,裏面語句寫的小括號卻沒有問題,不知道是不是和goto有關。有懂的歡迎下面留留言討論。

2、for循環(很重要)

for語句可以實現類似於C語言裏面的循環結構,當然for語句的功能要更強大一點,通過不同的參數可以實現更多的功能。for語句有多個參數,不同參數將會實現不同的功能。

官方幫助文檔:

E:\000dos\4筆記四>for /?
對一組文件中的每一個文件執行某個特定命令。

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

  %variable  指定一個單一字母可替換的參數。
  (set)      指定一個或一組文件。可以使用通配符。
  command    指定對每個文件執行的命令。
  command-parameters
             爲特定命令指定參數或命令行開關。

在批處理程序中使用 FOR 命令時,指定變量請使用 %%variable
而不要用 %variable。變量名稱是區分大小寫的,所以 %i 不同於 %I.

如果啓用命令擴展,則會支持下列 FOR 命令的其他格式:

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

    如果集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。

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

    檢查以 [drive:]path 爲根的目錄樹,指向每個目錄中的 FOR 語句。
    如果在 /R 後沒有指定目錄規範,則使用當前目錄。如果集僅爲一個單點(.)字符,
    則枚舉該目錄樹。

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)

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 ["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]

    fileset 爲一個或多個文件名。繼續到 fileset 中的下一個文件之前,
    每份文件都被打開、讀取並經過處理。處理包括讀取文件,將其分成一行行的文字,
    然後將每行解析成零或更多的符號。然後用已找到的符號字符串變量值調用 For 循環。
    以默認方式,/F 通過每個文件的每一行中分開的第一個空白符號。跳過空白行。
    你可通過指定可選 "options" 參數替代默認解析操作。這個帶引號的字符串包括一個
    或多個指定不同解析選項的關鍵字。這些關鍵字爲:

        eol=c           - 指一個行註釋字符的結尾(就一個)
        skip=n          - 指在文件開始時忽略的行數。
        delims=xxx      - 指分隔符集。這個替換了空格和製表符的
                          默認分隔符集。
        tokens=x,y,m-n  - 指每行的哪一個符號被傳遞到每個迭代
                          的 for 本身。這會導致額外變量名稱的分配。m-n
                          格式爲一個範圍。通過 nth 符號指定 mth。如果
                          符號字符串中的最後一個字符星號,
                          那麼額外的變量將在最後一個符號解析之後
                          分配並接受行的保留文本。
        usebackq        - 指定新語法已在下類情況中使用:
                          在作爲命令執行一個後引號的字符串並且一個單
                          引號字符爲文字字符串命令並允許在 file-set
                          中使用雙引號擴起文件名稱。

    某些範例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行,將
    每行中的第二個和第三個符號傳遞給 for 函數體,用逗號和/或
    空格分隔符號。請注意,此 for 函數體的語句引用 %i 來
    獲得第二個符號,引用 %j 來獲得第三個符號,引用 %k
    來獲得第三個符號後的所有剩餘符號。對於帶有空格的文件
    名,你需要用雙引號將文件名括起來。爲了用這種方式來使
    用雙引號,還需要使用 usebackq 選項,否則,雙引號會
    被理解成是用作定義某個要分析的字符串的。

    %i 在 for 語句中顯式聲明,%j 和 %k 是通過
    tokens= 選項隱式聲明的。可以通過 tokens= 一行
    指定最多 26 個符號,只要不試圖聲明一個高於字母 "z""Z" 的變量。請記住,FOR 變量是單一字母、分大小寫和全局的變量;
    而且,不能同時使用超過 52 個。

    還可以在相鄰字符串上使用 FOR /F 分析邏輯,方法是,
    用單引號將括號之間的 file-set 括起來。這樣,該字符
    串會被當作一個文件中的一個單一輸入行進行解析。

    最後,可以用 FOR /F 命令來分析命令的輸出。方法是,將
    括號之間的 file-set 變成一個反括字符串。該字符串會
    被當作命令行,傳遞到一個子 CMD.EXE,其輸出會被捕獲到
    內存中,並被當作文件分析。如以下例子所示:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    會枚舉當前環境中的環境變量名稱。

另外,FOR 變量參照的替換已被增強。你現在可以使用下列
選項語法:

     %~I          - 刪除任何引號("),擴展 %I
     %~fI        - 將 %I 擴展到一個完全合格的路徑名
     %~dI        - 僅將 %I 擴展到一個驅動器號
     %~pI        - 僅將 %I 擴展到一個路徑
     %~nI        - 僅將 %I 擴展到一個文件名
     %~xI        - 僅將 %I 擴展到一個文件擴展名
     %~sI        - 擴展的路徑只含有短名
     %~aI        - 將 %I 擴展到文件的文件屬性
     %~tI        - 將 %I 擴展到文件的日期/時間
     %~zI        - 將 %I 擴展到文件的大小
     %~$PATH:I   - 查找列在路徑環境變量的目錄,並將 %I 擴展
                   到找到的第一個完全合格的名稱。如果環境變量名
                   未被定義,或者沒有找到文件,此組合鍵會擴展到
                   空字符串

可以組合修飾符來得到多重結果:

     %~dpI       - 僅將 %I 擴展到一個驅動器號和路徑
     %~nxI       - 僅將 %I 擴展到一個文件名和擴展名
     %~fsI       - 僅將 %I 擴展到一個帶有短名的完整路徑名
     %~dp$PATH:I - 搜索列在路徑環境變量的目錄,並將 %I 擴展
                   到找到的第一個驅動器號和路徑。
     %~ftzaI     - 將 %I 擴展到類似輸出線路的 DIR

在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 語法
用一個有效的 FOR 變量名終止。選取類似 %I 的大寫變量名
比較易讀,而且避免與不分大小寫的組合鍵混淆。

0)、for語句中的幾種分隔符形式

其實for /l %i in (1,1,99) do @echo %i 括號中間的分隔號有多種形式如下:

for /l %i in (1,1,99) do @echo %i

for /l %i in (1 1 99) do @echo %i

for /l %i in (1;1;99) do @echo %i

for /l %i in (1=1=99) do @echo %i

都是打印出1到99。

1)、無參數

無參數的for語句能夠對設定的範圍內進行循環,是最基本的for循環語句。其命令格式爲:

FOR %%variable IN (set) DO command

其中,%%variable是批處理程序裏面的書寫格式,在DOS中書寫爲%variable,即只有一個百分號(%);set就是需要我們設定的循環範圍,類似於C語言裏面的循環變量;do後面的command就是循環所執行的命令,即循環體。

無參數for語句舉例:

@echo off
for %%i in (你,好,呀) do echo %%i
pause

執行結果:
在這裏插入圖片描述

2)、參數/L

含參數/L的for語句,可以根據set裏面的設置進行循環,從而實現對循環次數的直接控制。其命令格式爲:

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

1、其中,start爲開始計數的初始值,step爲每次遞增的值,end爲結束值。當end小於start時,step需要設置爲負數。
2、該集表示以增量形式從開始到結束的一個數字序列。因此,(1,1,5)將產生序列 1 2 3 4 5,(5,-1,1)將產生序列(5 4 3 2 1)

示例:
含參數/L的for語句舉例(創建5個文件夾):

@echo off
for /l %%i in (1,2,10) do md demo%%i
pause

執行之後:
在這裏插入圖片描述
在這裏插入圖片描述

上例將新建5個文件夾,文件夾名稱依次爲demo1、demo3、demo5、demo7、demo9。可以發現,%%i的結束值並非end的值10,而是不大於end的一個數。

3)、參數/F

含參數/F的for語句具有最強大的功能,它能夠對字符串進行操作,也能夠對命令的返回值進行操作,還可以訪問硬盤上的ASCII碼文件,比如txt文檔等。其命令格式爲:

FOR /F ["options"] %%variable IN (set) DO command

其中,set爲("string"、'command'、file-set)中的一個;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一個或多個的組合。各選項的意義參見for /f。一般情況下,使用較多的是skip、tokens、delims三個選項。

含參數/F的for語句舉例:

  1. 分開執行
@echo off
echo **No Options:
for /f %%a in ("1,4,7") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("2,5,8") do echo a=%%a b=%%b c=%%c
pause

執行結果:
在這裏插入圖片描述

  1. 打印當前目錄下的所有文件。

代碼:

@echo off
echo 本文件夾裏面的文件有:
for /f "skip=5 tokens=3,4 delims= " %%a in ('dir') do (
if not "%%a"=="<DIR>" if not "%%b"=="字節" if not "%%b"=="可用字節" echo     %%b
)
pause

執行結果:
在這裏插入圖片描述

  1. 將當前目錄下的文件信息寫入到指定文件E:\000dos\for1.txt
@echo off
echo 本文件夾裏面的文件有:
>E:\000dos\for1.txt dir
for /f "skip=5 tokens=3,4 delims= " %%a in (E:\000dos\for1.txt) do (
if not "%%a"=="<DIR>" if not "%%b"=="字節" if not "%%b"=="可用字節" echo     %%b
)

pause

執行之後:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

對於後面的兩個例子,其中options裏面的delims= 是可以刪除的,因爲只要添加了/F參數系統就將delims的值默認爲空格。
同時我們也看到了,for語句的do後面的command也是可以分行的,只需要保證command的左括號和do在同一行就可以了。

4)、參數/D或/R

含參數/D或/R的for語句是與目錄或文件有關的命令,一般情況下很少使用。含參數/R的命令有時候被用於通過遍歷文件夾來查找某一個文件或文件夾,故而列舉此例。

1. 含參數/R的for語句舉例(文件夾遍歷):

@echo off
setlocal enabledelayedexpansion
FOR /R e: %%i IN (.) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
pause
exit

運行效果:
**注意點:**這個不能再相同磁盤運行,不然運行不了。比如我這裏查詢E盤,我是複製到d盤執行纔可以。
在這裏插入圖片描述

上例即可以羅列出D盤下的所有文件夾,其速度要比命令"tree d:"慢多了,不過其返回結果的實用性則遠遠超過了tree命令。
一般情況下我們不推薦通過遍歷文件夾來查找文件,特別是在查找某些程序(比如QQ.exe)的位置時。推薦通過reg命令查找註冊表來查找QQ的路徑,以保證查找效率。
上例中也出現了幾個新面孔,如setlocal、感嘆號等。其中,感嘆號其實就是變量百分號(%)的強化版。之所以要用!而不用%,是因爲在for循環中,當一個變量被多次賦值時,%dd%所獲取的僅僅是dd第一次被賦予的值;要想刷新dd的值,就必須首先通過命令"setlocal enabledelayedexpansion"來開啓延遲變量開關,然後用!dd!來獲取dd的值。

5)、強化學習for的用法:

簡單說,FOR是個循環,可以用你指定的循環範圍生成一系列命令。最簡單的例子,就是人工指定循環範圍,然後對每個值執行指定的命令。
這些還不是FOR最強大的功能。我認爲它最強大的功能,表現在以下這些高級應用:

  1. 可以用 /r 參數遍歷整個目錄樹

  2. 可以用 /f 參數將文本文件內容作爲循環範圍

  3. 可以用 /f 參數將某一命令執行結果作爲循環範圍

  4. 可以用 %~ 操作符將文件名分離成文件名、擴展名、盤符等獨立部分

更多學習示例:

<1>、想快速報告每個硬盤分區的剩餘空間:
for %a in (c: d: e:) do @dir %a\ |find "可用字節"

在這裏插入圖片描述
我們以磁盤計算:最後的剩餘是19.18G空間
在這裏插入圖片描述
在這裏插入圖片描述

<2>、查看當前目錄下的bat文件內容:

代碼:

for %a in (*.bat) do type %a

在這裏插入圖片描述

<3>、 用 /r 遍歷目錄樹 :

當用 *.**.txt 等文件名通配符作爲 for /r 的循環範圍時,可以對當前目錄下所有文件(包括子目錄裏面的文件)進行操作。舉個例子,你想在當前目錄的所有bat文件(包括子目錄)內容中查找"pause"字樣,但由於find本身不能遍歷子目錄,所以我們用for:

for /r . %a in (*.bat) do @find "pause" %a

在這裏插入圖片描述
把上面命令改改更能直觀,其實這個應該是for的命令裏面加上/r就是個遞歸的查詢。
在這裏插入圖片描述

find 前面的 @ 只是讓輸出結果不包括 find 命令本身。這是DOS很早就有的功能。和FOR無關。

當用 . 作爲循環範圍時,for 只將子目錄的結構(目錄名)作爲循環範圍,而不包括裏面的文件。有點象 TREE 命令,不過側重點不同。TREE 的重點是用很漂亮易讀的格式輸出,而FOR的輸出適合一些自動任務,例如,我們都知道用deep管理的項目中,每個子目錄下都會有一個deep目錄,有時在軟件發行時我們想把這些deep目錄全部去掉(deep這裏只是一個代指):
在這裏插入圖片描述
然後執行命令:

for /r . %a in (.) do @if exist %a\deep rd /s /q %a\deep

在這裏插入圖片描述
在這裏插入圖片描述
可以看到,deep目錄以及刪除,如果需要刪除一個目錄下或者它的子目錄下的一個目錄,可以用這個方法,當然,如果刪除文件,可以使用剛剛的方法,只不過修改簡單的代碼即可。
如果不太理解,我這裏把隨意的變量a打印出來就懂了:
在這裏插入圖片描述
每個a就是所有的目錄。甚至通過這個方法可以獲取所有目錄,如果我想要一個目錄下的所有目錄都複製過去一個文件都是可以的。
我這裏說下我的大概思路:

  1. 打印出所有目錄
  2. 使用if exist file
  3. 判斷是否需要複製。

算了,我還是寫個簡單例子吧:

for /r . %a in (.) do @if not exist %a\name.txt copy e:\000dos\name.txt %a

在這裏插入圖片描述
執行之後,每個文件夾都有一個name.txt文件。

<4>、將某一文件內容或命令執行結果作爲循環範圍 :

假如你有一個文件 todel.txt,裏面是所有要刪除的文件列表,現在你想將裏面列出的每個文件都刪掉。假設這個文件是每個文件名佔一行,象這樣:

c:\temp\a1.txt

c:\temp\a2.txt

c:\temp\subdir\b3.txt

c:\temp\subdir\b4.txt

那麼可以用FOR來完成:

for /f %a in (todel.txt) do del %a 
<5>、將某一文件內容選取第幾列使用 :

這個命令還可以更強大。比如你的 todel.txt 並不是象上面例子那麼幹淨,而是由DIR直接生成,有一些沒用的信息,比如這樣:

Volume in drive D is DATA 

Volume Serial Number is C47C-9908 

Directory of D:\tmp 

09/26/2001 12:50 PM 18,426 alg0925.txt 

12/02/2001 04:29 AM 795 bsample.txt 

04/11/2002 04:18 AM 2,043 invitation.txt 

4 File(s) 25,651 bytes 

0 Dir(s) 4,060,700,672 bytes free 

for 仍然可以解出其中的文件名並進行操作:

for /f "skip=5 tokens=5" %a in (total.txt) do @if exist %a (DEL %a) else (echo %a不存在)

在這裏插入圖片描述
官方文檔:delims可以指定分隔符,默認是以空格和製表符(tab鍵)
在這裏插入圖片描述

比如分離日期:
在這裏插入圖片描述

for /f "tokens=3 delims=/ " %a in ('date /t') do @echo %a

在這裏插入圖片描述

<6>、查詢一個目錄下的文件的名字:

這些詳細使用可以參考官方文檔:

另外,FOR 變量參照的替換已被增強。你現在可以使用下列
選項語法:

     %~I          - 刪除任何引號("),擴展 %I
     %~fI        - 將 %I 擴展到一個完全合格的路徑名
     %~dI        - 僅將 %I 擴展到一個驅動器號
     %~pI        - 僅將 %I 擴展到一個路徑
     %~nI        - 僅將 %I 擴展到一個文件名
     %~xI        - 僅將 %I 擴展到一個文件擴展名
     %~sI        - 擴展的路徑只含有短名
     %~aI        - 將 %I 擴展到文件的文件屬性
     %~tI        - 將 %I 擴展到文件的日期/時間
     %~zI        - 將 %I 擴展到文件的大小
     %~$PATH:I   - 查找列在路徑環境變量的目錄,並將 %I 擴展
                   到找到的第一個完全合格的名稱。如果環境變量名
                   未被定義,或者沒有找到文件,此組合鍵會擴展到
                   空字符串

可以組合修飾符來得到多重結果:

     %~dpI       - 僅將 %I 擴展到一個驅動器號和路徑
     %~nxI       - 僅將 %I 擴展到一個文件名和擴展名
     %~fsI       - 僅將 %I 擴展到一個帶有短名的完整路徑名
     %~dp$PATH:I - 搜索列在路徑環境變量的目錄,並將 %I 擴展
                   到找到的第一個驅動器號和路徑。
     %~ftzaI     - 將 %I 擴展到類似輸出線路的 DIR

在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 語法
用一個有效的 FOR 變量名終止。選取類似 %I 的大寫變量名
比較易讀,而且避免與不分大小寫的組合鍵混淆。
for /r E:\000photo %I in (*.txt) do @echo %~nI

在這裏插入圖片描述

在這裏插入圖片描述
看懂這個也就看懂官方文檔了,好了,到此for學習的差不多了,後續需要哪些功能,再通過查看官方幫助文檔或者網上搜着學習,學習,一下子不可能什麼都學得會,不要想着都能掌握住。,慢慢積累。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章