dos bat批處理批量獲取文件名以及全路徑名

@echo off&setlocal enabledelayedexpansion 
SET index=0
::用以判斷字符串中是否包含對應字符串,可填寫多個,用\<字符串\>表示
SET excludestr="\<bat\> \<csv\> \<xls\> \<txt\>"
echo index	filefullname	filename
echo index,filefullname,filename >> 1.csv
::獲取文件名存入obj數組
for /f "delims=" %%a in ('dir /a/b/o:ed ') do ( 
	::判斷%%a中是否包含對應excludestr中的字符串
	echo %%a | findstr %excludestr% >nul
	::!errorlevel! 1 不包含 0 包含
	if !errorlevel! equ 1 ( 
		set "obj[!index!]=%%a"
		set /a "index += 1"
    )
)
SET index=0
::獲取文件全路徑名
for /f "delims=" %%a in ('dir /s/b/o:ed ') do ( 
	echo %%a | findstr %excludestr% >nul
	::!errorlevel! 1 不包含 0 包含
	if !errorlevel! equ 1 (
		set /a "in=!index!"
		set /a "index += 1"
		::(call %%!str!%%) 代替(!!str!!)
        call echo !index!	%%a	%%obj[!in!]%%
		::追加寫入到1.csv中
        call echo !index!,%%a,%%obj[!in!]%% >> 1.csv
    )
)
pause

關於其中幾個點的說明,理解後可以對批處理文件進行實用性修改:

  1. @echo off&setlocal enabledelayedexpansion 啓用變量延遲,在循環中對變量賦值取值所需,取值時相應的變量應當用!!包裹。
  2. for /f %%a in ('dir /a/b/o:ed ')用來獲取文件名,for /f本身是較爲強大的命令,這裏僅僅用來處理 in()中獲取到的字符串,字符串是由dir /a/b/o:ed 獲取到的文件名。
  3. for /f 後"delims="作用爲分割符,分割標誌爲=後面的內容,這裏for /f “delims=” %%a in其實等同於for /f %%a in,相應的,可以再delims=後加入相應符號,對應進行分割
  4. dir /a/b/o:ed 是dir命令的一個實際應用,dir命令爲dos中常用命令,作用是列出磁盤上文件目錄,後面/a/b/o爲對應的條件。
  5. echo %%a | findstr %excludestr% >nul 作用是判斷%%a中是否包含excludestr中的內容,通過errorlevel來獲取結果,1爲不包含,0爲包含,這裏需要注意因爲是循環中,必須使用!!包裹。errorlevel意義爲返回上一條命令成功或者失敗。需要注意的是,findstr判斷是,excludestr不僅僅可以是一個單獨的字符串,可以用<字符串>表示,列出像例子一樣的多個字符串進行判斷,只要包含其中一個就返回成功。
  6. 命令中用到了數組,數組取值時用到了!!的嵌套,然而不幸的是!!並不支持嵌套,強行寫的話,會被當做前後兩個變量識別。所以這裏用到了call,用以代替!!,比如這裏取數組中的值時,使用!obj[!in!]!,其結果只是輸出了in,而!obj[!!]!不存在,則不會進行處理。使用call代替則將外層!!用%%%%替換,命令call echo !index! %%a !obj[!in!]!替換爲call echo !index! %%a %%obj[!in!]%%,問題得到解決。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章