Board logo

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

作者: ChenCheChe    时间: 2024-2-2 22:28     标题: 求BAT代码批量检查当前目录以及子目录下全部文件的文件名字符数

求助大佬

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

中、英文符号全部算3个?
作者: newswan    时间: 2024-2-2 23:55

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

作者: newswan    时间: 2024-2-2 23:57

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

作者: Five66    时间: 2024-2-3 01:07

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

作者: Batcher    时间: 2024-2-3 19:35

回复 1# ChenCheChe


140个字符只计算文件名本身吗?还是路径也算进去?
作者: ChenCheChe    时间: 2024-2-4 00:17

回复 6# Batcher


    你好,只计算文件名字符
作者: Batcher    时间: 2024-2-4 09:06

回复 1# ChenCheChe


    能否介绍一下为什么汉字算3个字符?通常是英文、数字、半角符号占用1个字节,汉字和全角符号占用2个字节。
作者: buyiyang    时间: 2024-2-4 10:14

回复 8# Batcher


    Linux系统文件路径一般是utf-8编码,汉字一般是三个字节。
作者: aloha20200628    时间: 2024-2-4 11:27

本帖最后由 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
复制代码

作者: ppll2030    时间: 2024-2-5 22:10

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

作者: ChenCheChe    时间: 2024-2-6 19:06

感谢各位大神帮助!
作者: czjt1234    时间: 2024-2-7 10:17

回复 12# ChenCheChe


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

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




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