【Windows批處理】for詳解

基本用法

FOR %%i IN (command1) do command2

1、其中%%i,可以換成26個字母中的任意一個,這些字母會區分大小寫;也可以是數字
2、command1 表示的字符串或變量可以是一個,也可以是多個;每一個字符串或變量,我們稱之爲一個元素,每個元素之間,用空格鍵、跳格鍵、逗號、分號或等號分隔
3、for語句依次提取command1中的每一個元素,把它的值賦予形式變量 i,帶到do後的command2中參與命令的執行;如此循環,直到 command1 中的所有元素都已經被提取完畢,該 for 語句才宣告執行結束

栗子1:

@echo off
for %%i in (bbs,bathome,net) do echo %%i
pause

在這裏插入圖片描述
栗子2:顯示盤符

@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 當前硬盤分區有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause

在這裏插入圖片描述
%%i:代表盤符,例如c:

栗子3:列出文件

@echo off
for %%i in (*.*) do echo %%i
pause

在這裏插入圖片描述
這個 for 循環作用是 列出所有文件,所以文件夾沒列出來
在這裏插入圖片描述

列出 .txt 的文件

@echo off
for %%i in (*.txt) do echo %%i
pause

在這裏插入圖片描述
如果增加的 cdf.txt 這樣一個文件,需要排除這個,獲取兩個字以下文件

@echo off
for %%i in (??.txt) do echo %%i
pause

在這裏插入圖片描述

/f語句參數

有 a.txt,內容如下

aaaa
bbb
cc
d
@echo off
for /f %%i in (a.txt) do echo %%i

在這裏插入圖片描述
在這段代碼中,雖然執行結果是把 a.txt 中的所有內容都顯示出來了,貌似 for /f 語句是把整個a.txt一次性顯示到屏幕上,實際上並非如此
for /f語句中,這裏的元素是指文件中的每一行,也就是說,for /f 語句是以行爲單位處理文本文件的
在這裏插入圖片描述
這段代碼,主要是讓你樹立這樣一種觀念:逐行分析文本文件的內容,請使用 for /f 語句

delims=

a.txt內容

aaaaa,bbbb,ccc
dd,e
f
@echo off
for /f "delims=," %%i in (a.txt) do echo %%i

在這裏插入圖片描述
運行發現每行第一個逗號之後的所有內容都不見了(如果有不存在逗號的行,則保留原樣),也就說,你成功地提取到了每行第一個逗號之前的所有內容
delims=,,它的含義是:以逗號作爲被處理的字符串的分隔符號

你可以一次性指定多個分隔符號

aaaaa,bbbb.ccc
dd.e
f

在這裏插入圖片描述

tokens

使用 delims 的時候,for /f 默認只能提取到第一節的內容,如果要提取的內容不在第一節上,那怎麼辦?可以使用 tokens
tokens= 後面一般跟的是數字,可以跟一個或多個,每個數字之間用逗號分隔,如 tokens=3,5,8,它們的含義分別是:提取第2節字符串、提取第3、第5和第8節字符串。注意,這裏所說的"節",是由 delims= 這一開關劃分的

例如有 a.txt

aa,bb,cc,dd
ee,ff,gg,hh,ii,jj
kk
@echo off
for /f "delims=, tokens=3" %%i in (a.txt) do echo %%i

在這裏插入圖片描述
如果我想獲取1、3節,可以寫成這樣嗎

@echo off
for /f "delims=, tokens=1,3" %%i in (a.txt) do echo %%i

運行發現,只顯示了第 1 節的內容
在這裏插入圖片描述
原來,echo 後面的 %%i 只接收到了 tokens=1,3 中第一個數值1所代表的那個字符串,而第二個數值3所代表的字符串因爲沒有變量來接收,所以就無法在執行結果中顯示出來了

如果 tokens= 後面指定了多個數字,如果形式變量爲%%i,那麼,後邊的形式變量分別用 %%i、%%j、%%k…來接收。形式變量遵循字母的排序。所以如果第一個形式變量是%%i,那麼,第二個形式變量就是%%j;如果第一個形式變量用的是%%x,那麼,第二個 形式變量就是%%y

知道的剛纔代碼的問題,修改如下

@echo off
for /f "delims=, tokens=1,3" %%i in (a.txt) do echo %%i %%j

在這裏插入圖片描述
如果想要提取1,2,3,4 節內容你可以這樣寫

@echo off
for /f "delims=, tokens=1,2,3,4" %%i in (a.txt) do echo %%i %%j %%k %%l

當然也有更簡單的寫法,前邊寫成 1-4,後邊形式變量還是需要把變量寫全

@echo off
for /f "delims=, tokens=1-4" %%i in (a.txt) do echo %%i %%j %%k %%l

運行結果是一樣的
在這裏插入圖片描述
如果想讀取從第 2 節開始的所有的內容可以這樣寫

@echo off
for /f "delims=, tokens=2,*" %%i in (a.txt) do echo %%i %%j

在這裏插入圖片描述
第 2 節字符串被切分完之後,其餘部分字符串不做任何切分,整體作爲第二節字符串,整體被*所表示的一個變量接收

skip

有用的信息可能位於第N行之後的行內,爲了提高文本處理的效率,for /f 允許你跳過這些無用的行,直接從第 N+1行開始處理,這個時候,就需要使用參數 skip=n,其中,n是一個正整數,表示要跳過的行數

例如有 a.txt

aa,bb,cc,dd
ee,ff,gg,hh,ii,jj
kk,ll,mm,nn
oo,pp,qq,rr,ss,tt,uu
vv,ww,xx,yy,zz
@echo off
for /f "skip=3" %%i in (a.txt) do echo %%i

在這裏插入圖片描述

eol

忽略以指定字符打頭的行。例如有 a.txt

,aa,bb,cc,dd
,ee,ff,gg,hh,ii,jj
;kk,ll,mm,nn,
;oo,pp,qq,rr,ss,tt,uu
vv,ww,xx,yy,zz
for /f "eol=," %%i in (a.txt) do echo %%i

在這裏插入圖片描述
另外需要注意的是,for /f 語句是默認忽略以分號打頭的行內容的,正如它默認以空格鍵或跳格鍵作爲字符串的切分字符一樣。(注:eol=;這種默認設置,在delims=;時變得無效。),所以在設計即將用 for 讀取的配置文件的時候,可以在註釋文字的行首加上分號,例如我們使用上邊的代碼再執行一遍現在的 a.txt

@echo off
for /f "skip=3" %%i in (a.txt) do echo %%i

因爲跳過了前三行,所以按理說應該輸出

;oo,pp,qq,rr,ss,tt,uu
vv,ww,xx,yy,zz

但是執行結果只輸出了最後一行,所以證明 for /f 語句是默認忽略以分號打頭的行內容的
在這裏插入圖片描述
如果要取消這個默認設置,可選擇的辦法是:
1、爲eol=指定另外一個字符
2、使用 for /f “eol=” 語句,也就是說,強制指定字符爲空,就像對付delims=一樣

語式

1、for /f %%i in (文件名) do (……)
2、for /f %%i in ('命令語句') do (……)
3、for /f %%i in ("字符串") do (……)

1、如果讀取文本文件中的內容,應使用的是第1條語句;例如:想顯示 a.txt 中的內容,那麼,就使用 for /f %%i in (test.txt) do echo %%i
2、當讀取的是命令語句執行結果中的內容,第一個括號中的命令語句必須使用單引號包裹,應使用的是第2條語句;例如:顯示當前目錄下文件名中含有 test 的文本文件,應該使用 for /f %%i in ('dir /a-d /b *test*.txt') do echo %%i

/a-d 顯示文件
/a d 顯示目錄
/b 顯示文件名、擴展名

3、當要處理的是一個字符串,第一個括號中的內容必須用雙引號括起來, 應該用第3條語句;例如:當你想把 www.baidu.com 這串字符中的點號換爲短橫線並顯示出來,可以使用 @echo off for /f "delims=. tokens=1-3" %%i in ("www.baidu.com") do echo %%i-%%j-%%k

來看一個問題,如果存在一個文件 test 1.txt,那麼怎麼讀取呢,你可能會直接採用第一條語句
for /f %%i in (test 1.txt) do echo %%i 運行後,提示你 系統找不到文件 test。這是我們需要使用 usebackq,同時文件名稱也需要用 雙引號 括起來

for /f "usebackq" %%i in ("test 1.txt") do echo %%i

usebackq 是一個增強型參數,當使用了這個參數之後,原來的for語句中第一個括號內的寫法要做如下變動:
1、如果第一個括號裏的對象是文件名的話,要用雙引號"括起來,這樣就可以包含一些特殊符號
2、如果第一個括號裏的對象是一條命令語句的話,原來的單引號 ’ 要改爲後引號`
3、如果第一個括號裏的對象是字符串的話,原來的雙引號"要改爲單引號’

所以 for 有 6 中語式、

1、for /f %%i in (文件名) do (……)
2、for /f %%i in ('命令語句') do (……)
3、for /f %%i in ("字符串") do (……)
4、for /f "usebackq" %%i in ("文件名") do (……)
5、for /f "usebackq" %%i in (`命令語句`) do (……)
6、for /f "usebackq" %%i in ('字符串') do (……)

變量延遲

批處理程序在文件及文件夾管理中的應用實例 的最後,我們瞭解了變量延遲,這裏再深入學習下

執行:

@echo off
set num=12
echo %num%
pause

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

@echo off
set num=12&&echo %num%
pause

運行結果如下,說明在複合語句內部是沒有辦法修改變量的值的
在這裏插入圖片描述
運行

@echo off
set num=0
for /f %%i in ('dir /a-d /b *.txt') do (
	set /a num+=1
	echo num 當前的值爲 %num%
) 
echo 當前目錄下共%num%個txt文件

運行結果如下,說明 for 循環語句的 do(…) 是一條語句,在一條語句中是不能再修改變量的
在這裏插入圖片描述
我們使用變量延遲,讓複合語句內部的變量實時感知到變量值的變化
第一種方法: setlocal enabledelayedexpansion開啓,變量用一對歎號!!括起來
運行:

@echo off
setlocal enabledelayedexpansion
set num=12&&echo !num!
pause

在這裏插入圖片描述

@echo off
setlocal enabledelayedexpansion
set num=0
for /f %%i in ('dir /a-d /b *.txt') do (
	set /a num+=1
	echo num 當前的值爲 !num!
) 
echo 當前目錄下共%num%個txt文件

在這裏插入圖片描述
第二種方法: 使用call語句,在原來命令的前部加上call命令,並把變量引用的單層百分號對改爲雙層

@echo off
set num=12&&call echo %%num%%
pause

在這裏插入圖片描述

@echo off
set num=0
for /f %%i in ('dir /a-d /b *.txt') do (
	set /a num+=1
	call echo num 當前的值爲 %%num%%
) 
echo 當前目錄下共%num%個txt文件

在這裏插入圖片描述
總結:
何時使用:
在複合語句內部,如果某個變量的值發生了改變,並且改變後的值需要在複合語句內部的其他地方被用到,那麼,就需要使用變量延遲語句。而複合語句有:for語句、if……else語句、用連接符&、||和&&連接的語句、用管道符號|連接的語句,以及用括號括起來的、由多條語句組合而成的語句塊。最常見的場合,則是for語句和if……else語句
使用方法:
第一種方法: setlocal enabledelayedexpansion開啓,變量用一對歎號!!括起來,使用setlocal disabledelayedexpansion可以關閉變量延遲
第二種方法: 使用call語句,在原來命令的前部加上call命令,並把變量引用的單層百分號對改爲雙層

/r

for /r 的作用是“遞歸”,簡單說叫"遍歷文件夾",它會遍歷指定目錄和子目錄下的所有文件和文件夾語法 for /r 目錄 %%i in (元素集合) do 命令語句集合,其作用與嵌套進 for /f 複合語句的 “dir /ad /b /s 路徑” 功能類似
現在 d:\test 中有 a、b兩個文件夾。a 中有 a1.txt、a2.txt;b 中有 b1.txt、b2.txt

@echo off
for /r d:\test %%i in (.) do echo %%i
pause
for /f %%i in ('dir/ad/b/s d:\test') do echo %%i
pause
for /r d:\test %%i in (x y z) do echo %%i
pause

在這裏插入圖片描述
元素集合的含義是:列舉 d:\test 及其所有的子目錄,對所有的目錄路徑都分別添加x、y、z之後再顯示出來

@echo off
for /r d:\test %%i in (*.txt) do echo %%i
pause

在這裏插入圖片描述
這段代碼的含義是:列舉 d:\test 及其所有子目錄下的 txt 文本文件(以 .txt 結尾的文件夾不會被列出來)

關於 for /r 更多的解釋查看末尾的更多

/d

爲了處理文件夾 for /d %%i in (元素集合) do 命令語句集合
它僅能匹配當前目錄下的第一級文件夾,或是指定位置上的文件夾,而不能匹配更深層次的子文件夾
例如想查看當前目錄中有沒有 test開頭的文件夾

@echo off
for /d %%i in (test*) do echo %%i
pause

在這裏插入圖片描述

/l

先看例子

@echo off
for /l %%i in (1,2,10) do echo 麻花疼
pause

在這裏插入圖片描述
語法格式 for /l %%i in (x,y,z) do (……)
在這個語句中,x、y和z都只能取整數,正負皆可,x指代起始值,y指代步長,z爲終止值。步長y的值不能爲0

變量

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

我們可以看到每行都有一個大寫字母"I",這"I"其實就是我們在FOR帶入的變量,我們FOR語句代入的變量名是什麼,這裏就寫什麼

~I

首先建立一個 temp.txt,注意不成對的引號要加轉義字符^,重定向符號前不要留空格

@echo off
echo ^"1111>temp.txt
echo "2222">>temp.txt
echo 3333^">>temp.txt
echo "4444"44>>temp.txt
echo ^"55"55"55>>temp.txt

然後使用 以下命令讀取 temp.txt

@echo off
for /f %%i in (temp.txt) do echo %%i
pause

在這裏插入圖片描述
使用以下命令去掉 引號

@echo off
for /f %%i in (temp.txt) do echo %%~i
pause

在這裏插入圖片描述
刪除引號規則如下:
1、若字符串首尾同時存在引號,則刪除首尾的引號;
2、若字符串尾不存在引號,則刪除字符串首的引號;
3、如果字符串中間存在引號,或者只在尾部存在引號,則不刪除

%~fI
將 %I 擴展到一個完全合格的路徑名

@echo off
for /f %%i in ('dir /b') do echo %%i
pause

在這裏插入圖片描述
使用 ~fi

@echo off
for /f %%i in ('dir /b') do echo %%~fi
pause

在這裏插入圖片描述
%~dI
僅將 %I 擴展到一個驅動器號
在這裏插入圖片描述
%~pI
僅將 %I 擴展到一個路徑
在這裏插入圖片描述
%~nI
僅將 %I 擴展到一個文件名
在這裏插入圖片描述
%~xI
僅將 %I 擴展到一個文件擴展名
在這裏插入圖片描述
%~sI
擴展的路徑只含有短名
現在有文件
在這裏插入圖片描述
在這裏插入圖片描述
%~tI
將 %I 擴展到文件的日期/時間
在這裏插入圖片描述
%~zI
將 %I 擴展到文件的大小
在這裏插入圖片描述
%~$PATH:I
查找列在路徑環境變量的目錄,並將 %I 擴展到找到的第一個完全合格的名稱。如果環境變量名未被定義,或者沒有找到文件,此組合鍵會擴展到空字符串

@echo off
for /f %%i in ("EditPlus.exe") do echo %%~$PATH:i
pause

在這裏插入圖片描述
如果當前路徑沒有則
在這裏插入圖片描述
批處理-For詳解
FOR命令中的變量

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