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

[文本处理] 求BAT代码批量检查当前目录以及子目录下全部文件的文件名字符数

[复制链接]
发表于 2024-2-2 22:28:51 | 显示全部楼层 |阅读模式
求助大佬

目录下有很多文件,有的字符超过了140个字符,复制到nas会报错。
我想要用bat查找所有字符数量超过140的文件,用txt把路径和文件名保存下来,最好字符数量是能手动输入再搜索的
字符数量按照汉字算3个字符,符号算3个字符,英文和数字算一个字符。
求个代码,不胜感激!!
发表于 2024-2-2 23:19:52 | 显示全部楼层
中、英文符号全部算3个?
发表于 2024-2-2 23:55:39 | 显示全部楼层
powershell
识别的字符包括:数字 字母 : \ . -
计算长度也包括了 : \ .

  1. $folder = "d:\folder"
  2. $max =140
  3. Get-ChildItem $folder -Recurse | ForEach-Object {
  4.         $str1 = $_.FullName -replace "[0-9a-zA-Z:\\\-.]",""
  5.         $len = $str1.Length *2 + $_.FullName.Length
  6.         if ( $len -gt $max ) {
  7.                 "{0:d3} {1}" -f $len , $_.FullName
  8.         }
  9. }
复制代码
发表于 2024-2-2 23:57:20 | 显示全部楼层
要保存 最后一行后 加
  1. | Out-File list.txt
复制代码
发表于 2024-2-3 01:07:00 | 显示全部楼层
计算按完整路径来算
英文符号算1个
列表文件名___list.txt编码ansi(gbk)

  1. #/&cls&pause&powershell -c "type -literalpath '%~f0'|out-string|iex"&pause&exit

  2. $themax=140

  3. cmd /c cd.>___list.txt
  4. (gci -r) |?{
  5. $l=0
  6. $_.fullname.tochararray().foreach({
  7. if([int]$_ -gt 127){$l+=3}else{$l+=1}
  8. })
  9. if($l -gt $themax){1}else{0}
  10. } |%{$_.fullname
  11. } |sc ___list.txt
复制代码
发表于 2024-2-3 19:35:32 | 显示全部楼层
回复 1# ChenCheChe


140个字符只计算文件名本身吗?还是路径也算进去?
 楼主| 发表于 2024-2-4 00:17:20 | 显示全部楼层
回复 6# Batcher


    你好,只计算文件名字符
发表于 2024-2-4 09:06:41 | 显示全部楼层
回复 1# ChenCheChe


    能否介绍一下为什么汉字算3个字符?通常是英文、数字、半角符号占用1个字节,汉字和全角符号占用2个字节。
发表于 2024-2-4 10:14:26 | 显示全部楼层
回复 8# Batcher


    Linux系统文件路径一般是utf-8编码,汉字一般是三个字节。
发表于 2024-2-4 11:27:26 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-2-4 11:31 编辑

回复 1# ChenCheChe

既然目标是文件名字符总量,再区分其中不同字段有何意义呢?类同如下各式的计算逻辑...
1+3=4
2+2=4
1+1+2=4
1+1+1+1=4
给一个检查文件名字符总量的批处理版本如下,命令行参数指定文件名字符总量检查值,默认=140

  1. @echo off
  2. if "%~1"=="" (set "n=140") else set "n=%~1"
  3. (for /f "delims=" %%F in ('dir/s/b/a-d') do (set/p="%%~nF"<nul>0.0 &for /f %%v in ("0.0") do if %%~zv gtr %n% echo,%%F))>结果.lst
  4. del 0.0 & exit/b
复制代码

评分

参与人数 2技术 +2 收起 理由
_avatar_ + 1 思路比代码重要,学习啦
77七 + 1 感谢分享

查看全部评分

发表于 2024-2-5 22:10:50 | 显示全部楼层
根据要求,
1、汉字三字符,符号(包含中英)三字符,字母和数字一字符。
2、不含完整路径,只统计文件名(含后缀名)
3、字符长度可自由设置。
  1. @echo off
  2. set /p n=请输入字符长度,回车默认140:
  3. if not defined n set n=140
  4. for /f "delims=" %%F in ('dir/b/s/a-d') do (
  5.         if not exist "temp.vbs" call :vbs
  6.         for /f  %%a in ('cscript  //nologo temp.vbs "%%~nxF"') do if %%a gtr %n% echo,%%F------字符长度:%%a >>超长名单.txt
  7. )
  8. del temp.vbs & exit

  9. :vbs
  10. (echo Dim regex, str, result
  11. echo Set regex = New RegExp
  12. echo regex.Pattern = "[A-Za-z0-9]"
  13. echo regex.Global = True
  14. echo str = WScript.Arguments.Item(0^)
  15. echo OGC=Len(str^)
  16. echo result = regex.Replace(str, ""^)
  17. echo NAC=Len(result^)
  18. echo wscript.echo OGC+NAC*2
  19. )> temp.vbs
  20. goto:eof
复制代码
 楼主| 发表于 2024-2-6 19:06:32 | 显示全部楼层
感谢各位大神帮助!
发表于 2024-2-7 10:17:48 | 显示全部楼层
回复 12# ChenCheChe


说下哪位的代码符合要求呢

还有没看懂你到底是要统计字符数还是字节数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 05:46 , Processed in 0.060840 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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