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

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

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

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

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

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

评分人数

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

只移动不改名的话,可删除楼上代码从第6行开始以下所有%%a。

TOP

回复 17# 无情浪子哥
重新整理了一下,兼顾你的上一个帖子,移动并改名,可解决重名问题
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /d %%a in (*) do (
  4. pushd %%a
  5. for /f "delims=" %%i in ('dir /b /s /a-d') do (
  6.     if not exist "%%a%%~nxi" (move "%%i" "%%a%%~nxi") else (
  7.         if not exist "%%a%%~ni (2)%%~xi" (move "%%i" "%%a%%~ni (2)%%~xi") else (
  8.             set n=2
  9.             for %%j in ("%%a%%~ni (*)%%~xi") do (
  10.                 set "str=%%~nj"
  11.                 set "m=!str:%%a%%~ni (=!"
  12.                 set "m=!m:)=!"
  13.                 if !m! gtr !n! set /a n=m
  14.             )
  15.             set /a n+=1
  16.             move "%%i" "%%a%%~ni (!n!)%%~xi"
  17.         )
  18.     )
  19. )
  20. popd
  21. )
  22. pause
复制代码
1

评分人数

TOP

回复 17# 无情浪子哥


    这都不会运行?去找一找帮助吧。

TOP

回复 16# qixiaobin0715


    目前只能运行到三级,即使三级也是容易出错的
附加:https://wwa.lanzous.com/iYMAooyyj2d
谢谢

TOP

回复 15# 1152


    如何运行,在win7

TOP

回复 14# 无情浪子哥


    这个是POWERSHELL脚本

TOP

回复 12# xczxczxcz


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

TOP

回复 11# qixiaobin0715


    谢谢

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

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

TOP

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

TOP

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

回复 3# qixiaobin0715


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

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

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

TOP

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

TOP

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

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

TOP

返回列表