标题: [文件操作] [已解决]批处理如何实现同一文件夹内所有子文件夹合并? [打印本页]
作者: 无情浪子哥 时间: 2021-5-7 14:37 标题: [已解决]批处理如何实现同一文件夹内所有子文件夹合并?
本帖最后由 无情浪子哥 于 2023-2-16 11:22 编辑
举例:
修改前:
一级文件夹名称:JC00001
二级文件夹名称:身份证
三级文件夹名称:土地证
四级文件夹名称:户口本
修改后:
一级文件夹名称:JC00001包含所有N级文件夹内容
我有几百个一级文件夹,需要把每一个一级文件夹内所有的文件夹都去掉,但要保留内容到一级文件夹内
作者: 无情浪子哥 时间: 2021-5-7 14:41
附件:https://wwa.lanzous.com/iEmrIow3wyf
作者: qixiaobin0715 时间: 2021-5-7 15:37
回复 2# 无情浪子哥
兼顾你的上一个帖子,移动并改名- @echo off
- for /d %%a in (*) do (
- pushd %%a
- for /f "delims=" %%i in ('dir /b /s /a-d') do move "%%i" "%%a%%~nxi"
- popd
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2021-5-7 16:28
只移动不修改文件名,可将3楼代码第4行中move "%%i" "%%a%%~nxi"改为move "%%i"
作者: cutebe 时间: 2021-5-7 17:13
所有子目录中文件移到一起,可能会遇到重名文件!
作者: qixiaobin0715 时间: 2021-5-7 17:18
有可能,但写代码不能面面俱到,将所有可能性都考虑在内,遇到问题就解决问题。比如文本处理有可能遇到特殊字符,总不能每次写代码都要考虑吧。
作者: cutebe 时间: 2021-5-7 17:39
纯移动还好些。加了覆盖参数,或是删除命令、原文件修改等就比较危险了!
影响不大时可以忽略复杂情况,重要的文件还是安全第一。
作者: qixiaobin0715 时间: 2021-5-7 22:37
回复 7# cutebe
说的没错,新建一个文件夹,copy并改名最好;或者备份源文件再ren。前者有个缺点就是不能保持原有的目录结构,如果需要保持原有结构,还是养成备份文件的习惯。
作者: 无情浪子哥 时间: 2021-5-8 15:48
本帖最后由 无情浪子哥 于 2021-5-8 15:50 编辑
回复 3# qixiaobin0715
您好,我问下,如果一个文件夹中在移动过程中:有名字相同的,您的这个代码是选择覆盖还是重命名?如果重命名比如123-1加一个-1最好
刚刚测试了一下,相同的名字会覆盖。
麻烦请教一下,如何能不覆盖,比如相同的增加-1
作者: qixiaobin0715 时间: 2021-5-8 16:04
回复 9# 无情浪子哥
重名文件处理起来太麻烦,建议move后面加一个确认参数,即move /-y,提示后输入n,就不会移动重名文件,如果重名文件不多,可以手工修改文件名。
作者: qixiaobin0715 时间: 2021-5-8 16:20
回复 9# 无情浪子哥
至于如何偷懒直接处理重名文件,可参考以下帖子中的方法:
http://www.bathome.net/thread-58497-1-1.html
作者: xczxczxcz 时间: 2021-5-8 17:18
win7 以上系统,若有错误则先升级系统的POWERSHELL版本,
删掉程序中 每行前的 # 号,则会把子文件名添加到主文件夹后面,用 _ 号连接, 如:JC00001_身份证_土地证_户口本
子文件夹按顺序读取,同名自动加 (数字); 如:a(1).jpg, a(2).jpg;
用法:保存为:XXXX.ps1,ANSI编码,右键运行,不要用编辑器运行(除非你知道运行环境)。
XP 系统到微软官网下载 XP 版 POWERSHELL。但未测试XP版的语法是否完全兼容。- function New-FileName {
- param([string]$dir, [string]$baseName, [string]$extension, [int]$n=1);
- $targetName=[IO.Path]::Combine($dir, $baseName + $extension);
- if (![IO.File]::Exists($targetName)) {
- return $targetName;
- }
- else {
- $baseName=($baseName -replace '\s*\(\d+\)\s*$') + '(' + $n++ + ')';
- return New-FileName -dir $dir -baseName $baseName -extension $extension -n $n;
- }
- }
-
- (ls|?{$_.PsIsContainer}).Foreach{
- $folderPath=$_.FullName;
- $childFolders=ls $folderPath -r|?{$_.PsIsContainer}|sort @{e={$_.FullName.Length}; Ascending=$true};
- # $folderName=$_.Name;
- foreach ($childFolder in $childFolders) {
- # $folderName += '_' + $childFolder.Name;
- (ls $childFolder.FullName|?{!$_.PsIsContainer}).Foreach{
- $baseName=[IO.Path]::GetFileNameWithoutExtension($_.Name);
- $extension=[IO.Path]::GetExtension($_.Name);
- $newFile=New-FileName -dir $folderPath -baseName $baseName -extension $extension;
- Move-Item $_.FullName -dest $newFile -Verbose -Force;
- }
- }
- [IO.Directory]::Delete($childFolders[0].FullName, $true);
- # Rename-Item $folderPath -NewName $folderName -Force;
- }
- &cmd /c pause
复制代码
作者: 无情浪子哥 时间: 2021-5-9 10:39
回复 11# qixiaobin0715
谢谢
作者: 无情浪子哥 时间: 2021-5-9 10:52
回复 12# xczxczxcz
不好意思,不会你说的这个,我在想想其余的,谢谢
作者: 1152 时间: 2021-5-9 10:58
回复 14# 无情浪子哥
这个是POWERSHELL脚本
作者: 无情浪子哥 时间: 2021-5-9 20:50
回复 15# 1152
如何运行,在win7
作者: 无情浪子哥 时间: 2021-5-9 21:02
回复 16# qixiaobin0715
目前只能运行到三级,即使三级也是容易出错的
附加:https://wwa.lanzous.com/iYMAooyyj2d
谢谢
作者: 1152 时间: 2021-5-9 21:28
回复 17# 无情浪子哥
这都不会运行?去找一找帮助吧。
作者: qixiaobin0715 时间: 2021-5-10 06:49
回复 17# 无情浪子哥
重新整理了一下,兼顾你的上一个帖子,移动并改名,可解决重名问题- @echo off
- setlocal enabledelayedexpansion
- for /d %%a in (*) do (
- pushd %%a
- for /f "delims=" %%i in ('dir /b /s /a-d') do (
- if not exist "%%a%%~nxi" (move "%%i" "%%a%%~nxi") else (
- if not exist "%%a%%~ni (2)%%~xi" (move "%%i" "%%a%%~ni (2)%%~xi") else (
- set n=2
- for %%j in ("%%a%%~ni (*)%%~xi") do (
- set "str=%%~nj"
- set "m=!str:%%a%%~ni (=!"
- set "m=!m:)=!"
- if !m! gtr !n! set /a n=m
- )
- set /a n+=1
- move "%%i" "%%a%%~ni (!n!)%%~xi"
- )
- )
- )
- popd
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2021-5-11 05:48
只移动不改名的话,可删除楼上代码从第6行开始以下所有%%a。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |