Board logo

标题: [文件操作] 批处理如何批量删除文件夹名中的汉字后,重名文件夹内容合并 [打印本页]

作者: 172043209    时间: 2017-5-28 16:48     标题: 批处理如何批量删除文件夹名中的汉字后,重名文件夹内容合并

【新问题】如下:
现在如果是文件夹中含子文件夹,同时删除后面的汉字后,前面的字符串的文件夹名可能一样,目前楼下【版主】和【taofan712】提供的程序的处理结果是在第二个文件名加了一个“_1”来区分,现在希望把有删除汉字后文件夹名重复的时候,就把文件夹的内容合并,请问怎么修改?

另外【taofan712】提供的处理子文件夹按照12楼的建议 将  第三行,dir /b /ad改为dir /b /ad /s    闪屏后没有结果?


下面是原帖内容
帮忙修改一下:批量删除文件夹名中后面的中字
我现在比如有一批文件夹名字是   101-jx23-2.0002 奶茶12比例    或者   C01-jx23-2.0002奶茶比例     现在想删除后面的汉子
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%i in ('dir/ad/b *') do (
  4. call :hz "%%~ni"
  5. ren "%%i" "!fn!")
  6. goto :eof
  7. :hz
  8. set fn=%~1
  9. :begin
  10. echo !fn:~-1,4!|findstr /i "^[a-z0-9]*$">nul || (set fn=!fn:~,-1!&goto begin)
复制代码
这里删除的却是小数点后内容:.0002奶茶比例



请大侠们帮忙修改一下?
作者: taofan712    时间: 2017-5-28 23:00

本帖最后由 taofan712 于 2017-5-28 23:30 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /ad') do (
  4.     set "fn=%%~a"
  5.     set "fnw=!fn!"
  6.     for /f "tokens=1-5 delims=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.- " %%1 in ("%%~a") do (
  7.         if not "%%1%%2%%3%%4%%5"=="%%~a" (
  8.             call :change %%1 %%2 %%3 %%4 %%5
  9.         ) else (
  10.             ren "!fn!" chunhanzi 2>nul || ren "!fn!" chunhanzi_1
  11.         )
  12.     )
  13. )
  14. echo;处理完毕&pause>nul&exit /b
  15. :change
  16. for %%b in (%1 %2 %3 %4 %5) do set "fnw=!fnw:%%b=!"
  17. set "fnw=!fnw: =!"
  18. ren "!fn!" "!fnw!" 2>nul ||ren "!fn!" "!fnw!_1"
  19. goto :eof
复制代码
原以为不会太难,没想到在写的时候发现特殊情况会有很多,所以代码不是很完美。见谅。
作者: 老刘1号    时间: 2017-5-28 23:09

没搞太懂,是删除 . 后面所有的汉字?还是最后的非汉字后面的汉字?
作者: taofan712    时间: 2017-5-28 23:18

本帖最后由 taofan712 于 2017-5-28 23:19 编辑

回复 3# 老刘1号
文件名设想成这种情况:

汉123字
汉字a2
汉2字汉  3字3
—  aa汉#字
汉字
123字
a  2字
作者: 172043209    时间: 2017-5-28 23:19

回复 3# 老刘1号[/


是要删除字符串后面的汉字。字符串里面包括字母,数字,-和.
作者: 172043209    时间: 2017-5-28 23:21

回复 2# taofan712


   我测试一下!!
作者: 172043209    时间: 2017-5-28 23:23

回复 4# taofan712


    您好,把小数点删除掉了??
作者: 172043209    时间: 2017-5-28 23:26

需要保留住小数点,如C23-GH3421-34.00023 飞蝗芜湖      变成  C23-GH3421-34.00023

刚才的代码把34后面的小数点.也删除了
作者: taofan712    时间: 2017-5-28 23:30

本帖最后由 taofan712 于 2017-5-28 23:33 编辑

回复 7# 172043209


    在第六行,abcd那里,找个位置加上小数点就行。


但在以下情况会出现其他问题:
文件名本身就不含有汉字的文件夹数量在2个以上。
除汉字以外剩余的字母数字部分相同的文件夹数量在2个以上。
其他
作者: 老刘1号    时间: 2017-5-28 23:33

test.vbs
  1. Dim fso
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set ThisFolder=fso.GetFolder(".")
  4. For Each file In thisfolder.Files
  5. FileBaseName=fso.GetBaseName(File.Name)
  6. FileExtName=fso.GetExtensionName(File.Name)
  7. [判断] = True
  8. While [判断]
  9. If Clng("&H" & Hex(Asc(Right(FileBaseName,1)))) > 255 Then
  10. FileBaseName=Left(FileBaseName,Len(FileBaseName)-1)
  11. Else
  12. [判断]=False
  13. End If
  14. Wend
  15. fso.MoveFile file.Path,file.ParentFolder&"\"&FileBaseName&"."&FileExtName
  16. Next
复制代码

作者: 172043209    时间: 2017-5-28 23:35

回复 2# taofan712


    OK,感谢感谢,测试成功,加了一个符号,可以保留住小数点符号了,想再问一下,如果是想处理当前文件加下子文件名修改一下哪里?
作者: taofan712    时间: 2017-5-28 23:36

回复 11# 172043209


    第三行,dir /b /ad改为dir /b /ad /s
作者: 老刘1号    时间: 2017-5-28 23:37

回复 11# 172043209


    测试下我的,存为test.vbs
作者: 172043209    时间: 2017-5-29 00:00

回复 13# 老刘1号


    大侠,我测试了,你的是删除的文件,不是文件夹,备用,说不一定我也用的上的
作者: 老刘1号    时间: 2017-5-29 00:01

回复 14# 172043209


    ……尴尬了,原来是文件夹
作者: 172043209    时间: 2017-5-29 00:26

回复 12# taofan712


    这样改后测试不成功(想删除当前文件夹下的子文件夹的文件名中后面的汉字),把原来的文件夹名前面加上了路径,变成了【CUsersAdministratorDesktop批量挂接数据处理新建文件夹C01-2019-JX13-2.00031979-JX13-2.0016切勿】

谢谢!
作者: taofan712    时间: 2017-5-29 01:46

回复 16# 172043209
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /ad /s') do (
  4.     set "fn=%%~nxa"
  5.     set "fnw=%%~nxa"
  6.     for /f "tokens=1-5 delims=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.- " %%1 in ("%%~nxa") do (
  7.         if not "%%1%%2%%3%%4%%5"=="%%~a" (
  8.             call :change %%1 %%2 %%3 %%4 %%5
  9.         ) else (
  10.             ren "!fn!" chunhanzi 2>nul || ren "!fn!" chunhanzi_1
  11.         )
  12.     )
  13. )
  14. echo;处理完毕&pause>nul&exit /b
  15. :change
  16. for %%b in (%1 %2 %3 %4 %5) do set "fnw=!fnw:%%b=!"
  17. set "fnw=!fnw: =!"
  18. ren "!fn!" "!fnw!" 2>nul ||ren "!fn!" "!fnw!_1"
  19. goto :eof
复制代码

作者: 172043209    时间: 2017-5-29 08:48

回复 17# taofan712

测试没成功,提示:系统找不到指定文件

对当前同目录下的可执行,对于修改的文件夹下的子级文件夹还是不行,不知道原因在哪里?
作者: pcl_test    时间: 2017-5-29 11:16

本帖最后由 pcl_test 于 2017-5-29 23:02 编辑
  1. @echo off
  2. powershell ^
  3.     ^<#去掉-r则不处理子文件夹#^>^
  4.     dir . -r^|?{$_ -is [System.IO.DirectoryInfo]}^|^
  5.     sort {$_.FullName.length} -desc^|%%{^
  6.         $tmpname=($_.Name -replace '[\u4e00-\u9fa5]').trim();^
  7.         write-host $_.FullName.replace('%~dp0','.\') -nonewline;^
  8.         if($tmpname -and ($tmpname -ne $_.Name)){^
  9.             $newname=$_.Parent.FullName+'\'+$tmpname;^
  10.             $n=0;^
  11.             while(Test-Path -LiteralPath $newname){^
  12.                 $n++;^
  13.                 $newname=$_.Parent.FullName+'\'+$tmpname+'_'+$n;^
  14.             };^
  15.             mv -LiteralPath $_.FullName $newname;^
  16.             write-host (' --^> '+($newname.split('\')[-1])) -ForegroundColor green;^
  17.         }else{^
  18.             write-host ' --^> 为纯汉字或不含汉字,不处理' -ForegroundColor red;^
  19.         }^
  20.     }
  21. pause
复制代码

作者: 老刘1号    时间: 2017-5-29 11:28

回复 19# pcl_test


    原来unicode 4e00-9fa5是汉字的范围啊……
直接干掉所有双字节字符的路过……
作者: pcl_test    时间: 2017-5-29 11:36

回复 20# 老刘1号

就顶楼所描述的问题而言,干掉双字节字符妥妥的
作者: 172043209    时间: 2017-5-29 12:20

要是再加上一个是否删除子文件夹名中汉字的提示就好了,y, 删除 or  N, 路过

谢谢版主及其他两位!!
作者: 172043209    时间: 2017-6-3 12:48

现在如果是文件夹中含子文件夹,同时删除后面的汉字后,前面的字符串的文件夹名可能一样,程序的处理结果是在第二个文件名加了一个“_1”,我希望把有重复的时候,就把文件夹的内容合并,请问怎么修改?

按照12楼的建议 将  第三行,dir /b /ad改为dir /b /ad /s    闪屏后没有结果
作者: taofan712    时间: 2017-6-5 08:12

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo;请将需要处理的文件夹拖放进本窗口
  4. set /p folder=
  5. for /f "delims=" %%i in ('dir /ad /s /b %folder%') do set/a n+=1&&set .!n!=%%~fi
  6. (for /l %%n in (!n!,-1,1) do if defined .%%n echo;!.%%n!)>tmp.x
  7. for /f "delims=" %%a in (tmp.x) do (
  8.     cd /d "%%~fa"\..
  9.     set "fn=%%~nxa"
  10.     set "fnw=%%~nxa"
  11.     for /f "tokens=1-5 delims=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-." %%1 in ("%%~nxa") do (
  12.         if not "%%1%%2%%3%%4%%5"=="%%~nxa" (
  13.             call :change "%%1" "%%2" "%%3" "%%4" "%%5"
  14.         ) else (
  15.             call :chun
  16.         )
  17.     )
  18. )
  19. cd /d "%~dp0"&del /f /q tmp.x
  20. echo;处理完毕&pause>nul&exit /b
  21. :change
  22. for %%b in (%~1 %~2 %~3 %~4 %~5) do set "fnw=!fnw:%%b=!"
  23. set "fnw=!fnw: =!"
  24. set /a m=1
  25. if exist !fnw! (
  26.     :judge
  27.     if exist !fnw!_!m! (  
  28.         set /a m+=1
  29.         goto judge
  30.     )
  31. ren "!fn!" "!fnw!_!m!"
  32. goto :eof
  33. )
  34. ren "!fn!" "!fnw!"
  35. goto :eof
  36. :chun
  37. set /a m=1
  38. if exist chunhanzi (
  39.     :panduan
  40.     if exist chunhanzi_!m! (
  41.         set /a m+=1
  42.         goto panduan
  43.     )
  44. ren "!fn!" chunhanzi_!m!
  45. goto :eof
  46. )
  47. ren "!fn!" chunhanzi
  48. goto :eof
复制代码

作者: 172043209    时间: 2017-6-5 08:38

回复 24# taofan712
   
您好,这么早给我回复,谢谢了。条件是当删除文件夹名中汉字的时候,考虑到了不会有同名文件(如果合并文件夹时有同名文件可考虑在文件后面加序号,文件夹不用),对于子文件夹的问题,一般情况不会有很多层2-3,可能程序上会是一样的,是的,存在一个先处理子文件夹,再父文件夹,目前我需要处理用到的是bat程序放的文件夹再下面一层文件夹,如文件夹名123,123里面有多个文件夹1-a、1-b,...在这一级放置bat处理程序,处理各个1-a、1-b,...下面的文件夹名(这个时候的文件夹内就是文件了),先写完,随后测试。再次谢谢!马上测试。看到你在群里研究这个了。


刚测试了,拖入需要处理的文件夹,回车闪屏了??请问怎么回事,我上传一个测试文件,还请taofan712检查一下!!
作者: pcl_test    时间: 2017-6-5 14:50

回复 23# 172043209
  1. @echo off
  2. powershell ^
  3.     ^<#去掉-r则不处理子文件夹#^>^
  4.     dir . -r^|?{$_ -is [System.IO.DirectoryInfo]}^|^
  5.     sort {$_.FullName.length} -desc^|%%{^
  6.         $tmpname=($_.Name -replace '[\u4e00-\u9fa5]').trim();^
  7.         write-host $_.FullName.replace('%~dp0','.\') -nonewline;^
  8.         if($tmpname -and ($tmpname -ne $_.Name)){^
  9.             $newname=$_.Parent.FullName+'\'+$tmpname;^
  10.             if(Test-Path -LiteralPath $newname){^
  11.                 dir -LiteralPath $_.FullName^|%%{^
  12.                     $subname=$newname+'\'+$_.Name;^
  13.                     $n=0;^
  14.                     while(Test-Path -LiteralPath $subname){^
  15.                         $n++;^
  16.                         if($_ -is [System.IO.DirectoryInfo]){^
  17.                             $subname=$newname+'\'+$_.Name+'_'+$n;^
  18.                         }else{^
  19.                             $subname=$newname+'\'+$_.BaseName+'_'+$n+$_.Extension;^
  20.                         };^
  21.                     };^
  22.                     mv -LiteralPath $_.FullName $subname;^
  23.                 };^
  24.                 del -LiteralPath $_.FullName -Force;^
  25.                 write-host (' --^> '+($newname.split('\')[-1])+' 重名项,合并处理') -ForegroundColor yellow;^
  26.             }else{^
  27.                 mv -LiteralPath $_.FullName $newname;^
  28.                 write-host (' --^> '+($newname.split('\')[-1])) -ForegroundColor green;^
  29.             };^
  30.         }else{^
  31.             write-host ' --^> 为纯汉字或不含汉字,不处理' -ForegroundColor red;^
  32.         }^
  33.     }
  34. pause
复制代码

作者: llinnn    时间: 2021-1-13 11:28

test.vbs
老刘1号 发表于 2017-5-28 23:33

在这个基础上再删除一下文件名结尾的特定一个字母要怎么添加呢?意思就是说每个文件的结尾都有一个固定的字母J,我也不保留,只保留数字,删除所有的汉字跟字母




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