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!]%%,问题得到解决。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章