找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 18569|回复: 7

[文件操作] [已解决]批处理检查当前目录下文件名是否符合规则

[复制链接]
发表于 2024-6-4 23:43:27 | 显示全部楼层 |阅读模式
本帖最后由 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。
请问我的代码哪里出问题了?最好有个详细代码,我好对比一下。求解!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2024-6-5 08:31:18 | 显示全部楼层
回复 1# a6236130


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

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
发表于 2024-6-5 08:39:04 | 显示全部楼层
描述的还是不太清楚,最好文件名能举个例子,只能进行大致判断,不知是否可行,代码未测试:
  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
复制代码
 楼主| 发表于 2024-6-5 14:27:56 | 显示全部楼层
回复 3# qixiaobin0715


    谢谢!达到效果!
 楼主| 发表于 2024-6-5 14:29:15 | 显示全部楼层
回复 2# Batcher


    好的,谢谢!
发表于 2024-6-5 15:28:39 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 2技术 +2 收起 理由
a6236130 + 1 乐于助人
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2024-6-5 15:58:17 | 显示全部楼层
本帖最后由 a6236130 于 2024-6-5 15:59 编辑

回复 6# qixiaobin0715


    :lol 奈斯!
想再扩展一下,除了检查最低层文件名与其父级文件夹名称是否为一致,另外增加一个检查最底层文件夹与其上级文件夹名称是否为一致(例如:子文件夹AAA-BBB-CCC-01,父级文件夹名称为AAA-BBB-CCC ,同理获取子文件夹中的最后一个“-”作为取文件夹名称的依据。注意:文件夹结构不统一,有的除了父文件夹、子文件夹,也会有父文件夹、子文件夹、子子文件夹.....,以此类推。故而检查依据为取每个路径下最底层文件夹)
发表于 2024-6-5 17:09:49 | 显示全部楼层
本帖最后由 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:17 , Processed in 0.021773 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表