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

[文件操作] [已解决]批处理如何批量提取子文件夹内的文件至最上层的文件内?

『已解决』例:一级文件夹:二级文件夹:三级文件夹A,三级文件夹B,三级文件夹C......;目的:想要实现把三级文件内的所有文件提取到一级文件夹内;有方法可以实现吗?
1

评分人数

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

如果显示正确 去掉 move 前的 echo
  1. @echo off
  2. for /f "usebackq tokens=* delims=" %%a in (` 2^>nul dir /s /b /a-d `) do (
  3. if not “%%~fa” == "%CD%\%%~nxa" (
  4. echo move "%%~fa" .
  5. )
  6. )
复制代码

TOP

重新审题,三级 是 第三级? 不包括第二级

TOP

回复 3# newswan
只把第三级文件夹内的文件提取至一级文件夹内,bat最好是在一级文件夹的上一级目录运行,能行吗大佬!

TOP

本帖最后由 binghejin 于 2024-1-30 13:27 编辑

这需要你提供详细的文件夹结构,包含文件夹内都有什么文件,否则需要考虑的因素太多了,或者你需要拷贝的第三级文件夹有什么特征也可以,又或者明确就是第三级文件夹内的所有文件拷贝到一级文件夹内?
  1. @echo off&&setlocal enabledelayedexpansion
  2. set num=1
  3. cls
  4. for /f %%a in ('dir %1 /s /ad /b') do (
  5. if "!num!"=="1" (
  6. set /a num+=1
  7. ) ELSE (
  8. copy %%a\*.* %1\ >nul
  9. set /a num+=1
  10. )
  11. )
  12. pause
复制代码
以上代码可以拷贝三级文件夹内所有文件至一级文件夹内,但是没有考虑三级文件夹内如果还有四级文件夹的情况,所以请酌情使用,或者提供完整信息!
使用时,将一级文件夹拖到批处理文件图标上即可!

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. for /d %%d in (*) do (
  4. for /d %%e in ("%%d\*") do (
  5. for /d %%f in ("%%e\*") do (
  6. move /-y "%%f\*" "%%d\" 2>nul
  7. )
  8. )
  9. )
  10. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 1# 脑袋大

将如下代码保存为moveFiles.bat,假设一级文件夹为"D:\data\1",则在命令行窗口执行:moveFiles.bat "D:\data\1" 2
  1. @echo off
  2. setlocal
  3. cd /d "%~1"
  4. set "pt=%cd%"
  5. set currentLevel=0
  6. set depth=%2
  7. if not defined depth set depth=1
  8. set /a Out_ID=depth-1
  9. :procFolder
  10. pushd %1 2>nul || exit /b
  11. if %currentLevel% lss %depth% (
  12.   for /d %%F in (*) do (
  13.     if %currentLevel% equ %Out_ID% (
  14. pushd "%%~fF"
  15. for /f "tokens=*" %%a in ('dir /b /a-d') do move "%%~fa" "%pt%\"
  16. popd
  17. )
  18.     set /a currentLevel+=1
  19.     call :procFolder "%%F"
  20.     set /a currentLevel-=1
  21.   )
  22. )
  23. popd
复制代码
1

评分人数

TOP

本帖最后由 ppll2030 于 2024-1-30 14:10 编辑

根据要求。只针对第三级文件夹下的文件,其下子文件夹都不涉及。
代码保存bat文件,与一级目录并排,使用拖拽方式运行。
  1. @echo off
  2. set folder=%~1
  3. pushd "%~1"
  4. REM 创建一级目录下临时文件夹用于存放移动上来的文件,不需要可删除。同时删除第10行移动目标路径的 "temp\"
  5. md temp
  6. for /f %%D in ('dir /b /ad') do (
  7. pushd %%D
  8. for /f %%E in ('dir /b /ad') do (
  9. REM 请预览无误再去除echo执行转移,也可改用xcopy先复制一份出来查看
  10. echo move "%%E\*.*" "%~1\temp\"
  11. )
  12. popd
  13. )
  14. PAUSE
复制代码
1

评分人数

TOP

写两个不一样的,放一级文件夹
  1. @echo off&cd /d "%~dp0"
  2. set /a dep=2
  3. setlocal enabledelayedexpansion
  4. for /r %%i in (*) do (
  5.     set "f=%%i"
  6.     for /f %%a in ('cmd /u/q/c set /p"=!f:%~dp0=!"^<nul^|find /v ""^|find /c "\"') do (
  7.         if %%a equ %dep% move /y "%%i" "%~dp0"&&echo,%%i
  8.         )
  9.     )
  10. pause
复制代码
  1. @echo off&cd /d "%~dp0"
  2. setlocal enabledelayedexpansion
  3. for /r %%i in (*) do (
  4.     set "f=%%i"&set "f=!f:%~dp0=!"
  5.     for /f "tokens=3-4 delims=\" %%a in ("!f!") do (
  6.         if "%%b"=="" move /y "%%i" "%~dp0"&&echo,%%i
  7.         )
  8.     )
  9. pause
复制代码
1

评分人数

TOP

不统一回复了!感谢大家的帮助,目的已经实现!谢谢大家

TOP

返回列表