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

[文件操作] 批处理如何批量删除文件夹名中的汉字后,重名文件夹内容合并

【新问题】如下:
现在如果是文件夹中含子文件夹,同时删除后面的汉字后,前面的字符串的文件夹名可能一样,目前楼下【版主】和【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奶茶比例



请大侠们帮忙修改一下?

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

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

TOP

回复 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
复制代码
1

评分人数

    • 172043209: 完美运行,爱死你了,版主技术 + 1

TOP

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


刚测试了,拖入需要处理的文件夹,回车闪屏了??请问怎么回事,我上传一个测试文件,还请taofan712检查一下!!

TOP

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

评分人数

    • 172043209: 解决了子文件夹问题技术 + 1

TOP

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

按照12楼的建议 将  第三行,dir /b /ad改为dir /b /ad /s    闪屏后没有结果

TOP

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

谢谢版主及其他两位!!

TOP

回复 20# 老刘1号

就顶楼所描述的问题而言,干掉双字节字符妥妥的

TOP

回复 19# pcl_test


    原来unicode 4e00-9fa5是汉字的范围啊……
直接干掉所有双字节字符的路过……
1

评分人数

    • taofan712: 据说有些特殊符号也是双字节,大括号技术 + 1

TOP

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

评分人数

TOP

回复 17# taofan712

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

对当前同目录下的可执行,对于修改的文件夹下的子级文件夹还是不行,不知道原因在哪里?

TOP

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

TOP

回复 12# taofan712


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

谢谢!

TOP

回复 14# 172043209


    ……尴尬了,原来是文件夹

TOP

回复 13# 老刘1号


    大侠,我测试了,你的是删除的文件,不是文件夹,备用,说不一定我也用的上的

TOP

返回列表