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

[文件操作] [已解决]批处理如何实现同一文件夹内所有子文件夹合并?

本帖最后由 无情浪子哥 于 2023-2-16 11:22 编辑

举例:
修改前:
一级文件夹名称:JC00001
二级文件夹名称:身份证
三级文件夹名称:土地证
四级文件夹名称:户口本

修改后:
一级文件夹名称:JC00001包含所有N级文件夹内容

我有几百个一级文件夹,需要把每一个一级文件夹内所有的文件夹都去掉,但要保留内容到一级文件夹内
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

附件:https://wwa.lanzous.com/iEmrIow3wyf

TOP

回复 2# 无情浪子哥
兼顾你的上一个帖子,移动并改名
  1. @echo off
  2. for /d %%a in (*) do (
  3. pushd %%a
  4. for /f "delims=" %%i in ('dir /b /s /a-d') do move "%%i" "%%a%%~nxi"
  5. popd
  6. )
  7. pause
复制代码

TOP

只移动不修改文件名,可将3楼代码第4行中move "%%i" "%%a%%~nxi"改为move "%%i"

TOP

所有子目录中文件移到一起,可能会遇到重名文件!
如无特别说明,代码测试环境均为 XP SP3

TOP

有可能,但写代码不能面面俱到,将所有可能性都考虑在内,遇到问题就解决问题。比如文本处理有可能遇到特殊字符,总不能每次写代码都要考虑吧。

TOP

纯移动还好些。加了覆盖参数,或是删除命令、原文件修改等就比较危险了!

影响不大时可以忽略复杂情况,重要的文件还是安全第一。
如无特别说明,代码测试环境均为 XP SP3

TOP

回复 7# cutebe
说的没错,新建一个文件夹,copy并改名最好;或者备份源文件再ren。前者有个缺点就是不能保持原有的目录结构,如果需要保持原有结构,还是养成备份文件的习惯。

TOP

本帖最后由 无情浪子哥 于 2021-5-8 15:50 编辑

回复 3# qixiaobin0715


  您好,我问下,如果一个文件夹中在移动过程中:有名字相同的,您的这个代码是选择覆盖还是重命名?如果重命名比如123-1加一个-1最好

刚刚测试了一下,相同的名字会覆盖。

麻烦请教一下,如何能不覆盖,比如相同的增加-1

TOP

回复 9# 无情浪子哥
重名文件处理起来太麻烦,建议move后面加一个确认参数,即move /-y,提示后输入n,就不会移动重名文件,如果重名文件不多,可以手工修改文件名。

TOP

回复 9# 无情浪子哥
至于如何偷懒直接处理重名文件,可参考以下帖子中的方法:
http://www.bathome.net/thread-58497-1-1.html

TOP

win7 以上系统,若有错误则先升级系统的POWERSHELL版本,
删掉程序中 每行前的 # 号,则会把子文件名添加到主文件夹后面,用 _ 号连接, 如:JC00001_身份证_土地证_户口本
子文件夹按顺序读取,同名自动加 (数字); 如:a(1).jpg,  a(2).jpg;
用法:保存为:XXXX.ps1,ANSI编码,右键运行,不要用编辑器运行(除非你知道运行环境)。
XP 系统到微软官网下载 XP 版 POWERSHELL。但未测试XP版的语法是否完全兼容。
  1. function New-FileName {
  2. param([string]$dir, [string]$baseName, [string]$extension, [int]$n=1);
  3. $targetName=[IO.Path]::Combine($dir, $baseName + $extension);
  4. if (![IO.File]::Exists($targetName)) {
  5. return $targetName;
  6. }
  7. else {
  8. $baseName=($baseName -replace '\s*\(\d+\)\s*$') + '(' + $n++ + ')';
  9. return New-FileName -dir $dir -baseName $baseName -extension $extension -n $n;
  10. }
  11. }
  12. (ls|?{$_.PsIsContainer}).Foreach{
  13. $folderPath=$_.FullName;
  14. $childFolders=ls $folderPath -r|?{$_.PsIsContainer}|sort @{e={$_.FullName.Length}; Ascending=$true};
  15. # $folderName=$_.Name;
  16. foreach ($childFolder in $childFolders) {
  17. # $folderName += '_' + $childFolder.Name;
  18. (ls $childFolder.FullName|?{!$_.PsIsContainer}).Foreach{
  19. $baseName=[IO.Path]::GetFileNameWithoutExtension($_.Name);
  20. $extension=[IO.Path]::GetExtension($_.Name);
  21. $newFile=New-FileName -dir $folderPath -baseName $baseName -extension $extension;
  22. Move-Item $_.FullName -dest $newFile -Verbose -Force;
  23. }
  24. }
  25. [IO.Directory]::Delete($childFolders[0].FullName, $true);
  26. # Rename-Item $folderPath -NewName $folderName -Force;
  27. }
  28. &cmd /c pause
复制代码
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 11# qixiaobin0715


    谢谢

TOP

回复 12# xczxczxcz


    不好意思,不会你说的这个,我在想想其余的,谢谢

TOP

回复 14# 无情浪子哥


    这个是POWERSHELL脚本

TOP

返回列表