Board logo

标题: [文件操作] [已解决]批处理检查当前目录下文件名是否符合规则 [打印本页]

作者: a6236130    时间: 2024-6-4 23:43     标题: [已解决]批处理检查当前目录下文件名是否符合规则

本帖最后由 a6236130 于 2024-6-5 14:29 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. >list.log echo 不符合命名规则的文件列表:
  4. for /d /r %%D in (*) do (
  5.     for %%F in ("%%D\*") do (
  6.         set "fullFileName=%%~nxF"
  7.         set "parentDir=%%~nxD"
  8.         set "lastDash=!fullFileName:*-=-!"
  9.         set "folderName=!fullFileName:~0,-5!"
  10.         set "expectedName=!folderName!-!fullFileName:~-4!"
  11.         if NOT "!fullFileName!" == "!expectedName!" (
  12.             echo %%D\%%F >> list.log
  13.         )
  14.     )
  15. )
  16. pause
复制代码
数据规则1、文件名格式为文件所在文件夹名称-文件名,其中文件名中最后一个“-”之前就是文件夹名称,“-”之后则是文件名(即文件名中最后五位数为“-”+原四位数文件名)。注意:文件名中的文件夹名称中存在“-、·“,故而需要以文件名中最后一个“-”进行判断取值文件夹名称和文件名。
功能1、遍历当前目录下所有文件夹和文件。2、检查所有文件的文件名是否为文件所在上级文件夹名称-文件名。3,如有检查出文件名不符合文件所在上级文件夹名称-文件名该规则的,则将该文件记录下来,保存为list.log。
请问我的代码哪里出问题了?最好有个详细代码,我好对比一下。求解!
作者: Batcher    时间: 2024-6-5 08:31

回复 1# a6236130


请截图提供以下内容:
1、符合规则的文件名及其所在的文件夹
2、不符合规则的文件名及其所在的文件夹
3、你的代码得到的结果与希望的结果之间有哪些差异

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: qixiaobin0715    时间: 2024-6-5 08:39

描述的还是不太清楚,最好文件名能举个例子,只能进行大致判断,不知是否可行,代码未测试:
  1. @echo off
  2. (for /f "delims=" %%i in ('dir /s /b /ad') do (
  3.     pushd "%%i"
  4.     for /f "delims=" %%j in ('dir /b /a-d^|findstr /bv "%%~nxi\-"') do (
  5.         echo,"%%i\%%j"
  6.     )
  7.     popd
  8. ))>list.log
  9. pause
复制代码

作者: a6236130    时间: 2024-6-5 14:27

回复 3# qixiaobin0715


    谢谢!达到效果!
作者: a6236130    时间: 2024-6-5 14:29

回复 2# Batcher


    好的,谢谢!
作者: qixiaobin0715    时间: 2024-6-5 15:28

本帖最后由 qixiaobin0715 于 2024-6-5 15:34 编辑

回复 1# a6236130
按照你的大体思路,应当也可以:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in ('dir /s /b /ad') do (
  4.     pushd "%%i"
  5.     for /f "delims=" %%j in ('dir /b /a-d') do (
  6.         set str=%%~nj
  7.         set str=!str:~,-5!
  8.         if not "!str!"=="%%~nxi" echo,%%i\%%j
  9.     )
  10.     popd
  11. ))>list.log
  12. pause
复制代码

作者: a6236130    时间: 2024-6-5 15:58

本帖最后由 a6236130 于 2024-6-5 15:59 编辑

回复 6# qixiaobin0715


    :lol 奈斯!
想再扩展一下,除了检查最低层文件名与其父级文件夹名称是否为一致,另外增加一个检查最底层文件夹与其上级文件夹名称是否为一致(例如:子文件夹AAA-BBB-CCC-01,父级文件夹名称为AAA-BBB-CCC ,同理获取子文件夹中的最后一个“-”作为取文件夹名称的依据。注意:文件夹结构不统一,有的除了父文件夹、子文件夹,也会有父文件夹、子文件夹、子子文件夹.....,以此类推。故而检查依据为取每个路径下最底层文件夹)
作者: qixiaobin0715    时间: 2024-6-5 17:09

本帖最后由 qixiaobin0715 于 2024-6-5 17:12 编辑

未仔细考虑,大概是这样:
  1. @echo off
  2. for /f "delims=" %%i in ('dir /s /b /ad') do (
  3.     setlocal enabledelayedexpansion
  4.     dir /b /ad "%%i"|findstr .>nul 2>nul
  5.     if errorlevel 1 (
  6.         set "str1=%%~nxi"
  7.         for %%j in ("%%i\..") do (
  8.             set "str2=!str1:%%~nxj=!"
  9.             if "!str1!"=="!str2!" echo,%%i
  10.         )
  11.     )
  12.     endlocal
  13. )
  14. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2