标题: [文件操作] [已解决]批处理移动一级子目录下且仅有一个文件的将这一个文件移动到当前目录的逻辑 [打印本页]
作者: thp2008 时间: 2023-11-30 23:19 标题: [已解决]批处理移动一级子目录下且仅有一个文件的将这一个文件移动到当前目录的逻辑
本帖最后由 thp2008 于 2023-12-1 14:05 编辑
我想批量将当前目录下,比如有500个子目录,但是其中可能有300个子目录,下面只有一个文件,而且这300子目录下面,没有其它的子目录了,剩下的子目录下可能有多级子目录,或者多于1个文件,
我的要求是:只检查当前目录下的,一级子目录。就是当前目录的一级子目录,如果这个一级子目录没有其它子目录了,文件数量又只有一个的情况,将这符合要求的300个子目录的文件,移动到当前目录,遇到重名的,自动在文件后面加序号,移动完成后,将这些空目录删除。
这个逻辑AI始终搞不定,只能来求助大神了。
作者: Five66 时间: 2023-12-1 06:52
保存为ansi编码的bat,放到当前目录下运行
使用前先测试,测试前先备份- @echo off
- for /d %%a in (*) do (
- setlocal
- for /d %%b in ("%%a\*") do set hasfolder=1
- if not defined hasfolder (
- for %%c in ("%%a\*") do (
- set file=%%~fc
- set /a n+=1
- )
- setlocal enabledelayedexpansion
- if !n! == 1 (endlocal&call :aaa) else endlocal
- )
- endlocal
- )
- echo,&pause&exit/b
-
- :aaa
- if defined m set "p=(%m%)"
- for %%z in ("%file%") do (
- if not exist "%%~nz%p%%%~xz" (
- move "%%~z" ".\%%~nz%p%%%~xz" && rmdir "%%~dpz") else (
- set /a m+=1&goto :aaa
- )
- )
- goto :eof
复制代码
作者: thp2008 时间: 2023-12-1 13:23
本帖最后由 thp2008 于 2023-12-1 14:04 编辑
帮谢您的帮助,可以移动成功,只是移动完成后,删除文件夹,需要做一下,延时处理,否则删除不了,提示:目录不是空的。
如果延时不好处理,或者可以改变一下思路,首先只将符合要求的文件,移动到当前目录,全部移动完成后,单独用一段代码,删除当前目录下的,所有空目录。
我仔细研究了一下,是所有这些目录下,都有一个隐藏属性的种子文件,所以删除不了。
我修改了一下,搞定了,感谢!- @echo off
- echo 移动当
- for /d %%a in (*) do (
- setlocal
- for /d %%b in ("%%a\*") do set hasfolder=1
- if not defined hasfolder (
- for %%c in ("%%a\*") do (
- set file=%%~fc
- set /a n+=1
- )
-
- setlocal enabledelayedexpansion
- if !n! == 1 (endlocal&call :aaa) else endlocal
- )
- endlocal
- )
- del *.torrent /s/a
- for /f "tokens=*" %%a in ('dir /b /ad /s^|sort /r') do rd "%%a" >nul
- echo 空目录删除完成。
- echo,&pause&exit/b
-
- :aaa
- if defined m set "p=(%m%)"
- for %%z in ("%file%") do (
- if not exist "%%~nz%p%%%~xz" (
- move "%%~z" ".\%%~nz%p%%%~xz") else (
- set /a m+=1&goto :aaa
- )
- )
- goto :eof
复制代码
作者: qixiaobin0715 时间: 2023-12-1 16:29
本帖最后由 qixiaobin0715 于 2023-12-3 10:26 编辑
真心不习惯用goto和call语句,这样不知可否,未测试:- @echo off
- setlocal enabledelayedexpansion
- del /s /a /f *.torrent
- for /f "delims=" %%i in ('dir /b /ad') do (
- set n=0
- pushd "%%i"
- for /f "delims=" %%j in ('dir /b') do set /a n+=1
- if !n! equ 1 (
- for /f "delims=" %%k in ('dir /b /a-d 2^>nul') do (
- set /a "_%%k+=1"
- if "!_%%k!"=="1" (
- move "%%k" "%~dp0"
- ) else (
- move "%%k" "%~dp0\%%~nk!_%%k!%%~xk"
- )
- )
- )
- popd
- rd "%%i" 2>nul
- )
- pause
复制代码
善意提醒:自己根据情况看看第3行del命令放在何处符合要求。上面会删除当前目录下的所有有关文件,包括子目录。
作者: thp2008 时间: 2023-12-1 22:29
真心不习惯用goto和call语句,这样不知可否,未测试:善意提醒:自己根据情况看看第3行del命令放在何处符合 ...
qixiaobin0715 发表于 2023-12-1 16:29
可以,感谢帮助,就是有一点,如果遇到有同名文件,你这个会加序号,但是把扩展名弄没了,其它没问题。
作者: qixiaobin0715 时间: 2023-12-3 10:27
回复 5# thp2008
代码第14行把扩展名加上就行啊,还是要懂一点批处理基础知识的。
作者: qixiaobin0715 时间: 2023-12-4 15:12
本帖最后由 qixiaobin0715 于 2023-12-4 15:15 编辑
回复 4# qixiaobin0715
需要提醒的一点是使用此代码时,文件名中不能含有“+-...”等运算符,这些符号在第10行代码中为非法变量名。
作者: thp2008 时间: 2023-12-6 19:07
好的,明白了,感谢提醒。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |