[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

求助大佬

目录下有很多文件,有的字符超过了140个字符,复制到nas会报错。
我想要用bat查找所有字符数量超过140的文件,用txt把路径和文件名保存下来,最好字符数量是能手动输入再搜索的
字符数量按照汉字算3个字符,符号算3个字符,英文和数字算一个字符。
求个代码,不胜感激!!

中、英文符号全部算3个?
bat小白,请多指教!谢谢!

TOP

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. }
复制代码

TOP

要保存 最后一行后 加
  1. | Out-File list.txt
复制代码

TOP

计算按完整路径来算
英文符号算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
复制代码

TOP

回复 1# ChenCheChe


140个字符只计算文件名本身吗?还是路径也算进去?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# Batcher


    你好,只计算文件名字符

TOP

回复 1# ChenCheChe


    能否介绍一下为什么汉字算3个字符?通常是英文、数字、半角符号占用1个字节,汉字和全角符号占用2个字节。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 8# Batcher


    Linux系统文件路径一般是utf-8编码,汉字一般是三个字节。

TOP

本帖最后由 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

评分人数

    • _avatar_: 思路比代码重要,学习啦技术 + 1
    • 77七: 感谢分享技术 + 1

TOP

根据要求,
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
复制代码

TOP

感谢各位大神帮助!

TOP

回复 12# ChenCheChe


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

还有没看懂你到底是要统计字符数还是字节数

QQ 20147578

TOP

返回列表