找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 7935|回复: 7

[文件操作] [已解决]如何增加拖拽进批处理获取路径的功能

[复制链接]
发表于 2025-6-3 17:11:50 | 显示全部楼层 |阅读模式
本帖最后由 a6236130 于 2025-6-4 22:36 编辑
  1. echo off
  2. set "file_name=A1"
  3. set "DstDir=E:\TQ"
  4. if not exist "%DstDir%" md "%DstDir%"
  5. for /d %%i in (%file_name%) do (
  6. for /f "delims=*" %%a in ('dir /b /s /a-d *%%i*.jpg') do (
  7. set "_path=%%~dpa"
  8.     setlocal enabledelayedexpansion
  9.     if /i "!_path:%DstDir%=!" equ "!_path!" (
  10.         set "_path=!_path:%~dp0=!"
  11.         set "_path=!_path:\=-!"
  12.                 if not exist "%DstDir%\!_path:~0,-1!" md "%DstDir%\!_path:~0,-1!"
  13.         echo Y|move "%%a" "%DstDir%\!_path:~0,-1!\%%~nxa"
  14.     )
  15.     endlocal
  16. )
  17. )
  18. pause
复制代码
代码如上,需要新增一个可以将拖拽文件夹进批处理界面以获取路径的功能,需要如何修改,求具体代码?
发表于 2025-6-3 18:23:27 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 设置目标目录
  4. set "DstDir=E:\TQ"

  5. :: 如果没有目标目录则创建
  6. if not exist "%DstDir%" md "%DstDir%"

  7. :: 判断是否有拖拽参数传入
  8. if "%~1"=="" (
  9.     echo 没有拖拽文件夹,使用默认逻辑处理当前目录下包含 A1 的文件...
  10.     set "file_name=A1"
  11.     call :ProcessFiles *%file_name%*
  12. ) else (
  13.     echo 检测到拖拽的路径:
  14.     :LoopThroughArgs
  15.     if not "%~1"=="" (
  16.         echo 正在处理路径: %~1

  17.         :: 判断是否为文件还是文件夹
  18.         if exist "%~1" (
  19.             echo 是一个文件夹,直接处理
  20.             pushd "%~1"
  21.         ) else (
  22.             echo 是一个文件,将处理其所在文件夹
  23.             pushd "%~dp1"
  24.         )

  25.         call :ProcessFiles *
  26.         popd
  27.         shift
  28.         goto LoopThroughArgs
  29.     )
  30. )

  31. pause
  32. exit /b

  33. :: 子程序:处理指定路径下的所有 *.jpg 文件
  34. :ProcessFiles
  35. for /f "delims=*" %%a in ('dir /b /s /a-d *.jpg') do (
  36.     set "_path=%%~dpa"
  37.     setlocal enabledelayedexpansion
  38.     if /i "!_path:%DstDir%=!" equ "!_path!" (
  39.         set "_path=!_path:%~dp0=!"
  40.         set "_path=!_path:\=-!"
  41.         if not exist "%DstDir%\!_path:~0,-1!" md "%DstDir%\!_path:~0,-1!"
  42.         echo Y|move "%%a" "%DstDir%\!_path:~0,-1!\%%~nxa" >nul 2>&1
  43.     )
  44.     endlocal
  45. )
  46. goto :eof
复制代码
发表于 2025-6-3 21:39:27 | 显示全部楼层
回复 1# a6236130

一楼代码最终是要 move "当前目录及其子目录中的*.jpg" "%DstDir%\...",楼主须明确拖入批处理脚本的路径是要替代 当前目录 还是要替代 %DetDir% ?
 楼主| 发表于 2025-6-4 22:37:24 | 显示全部楼层
回复 2# 1139054012


    我自己解决了,但还是感谢您的帮助
 楼主| 发表于 2025-6-4 22:40:12 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "DstDir=E:\1"
  4. if not exist "%DstDir%" md "%DstDir%"
  5. :GetFolder
  6. set /p "folderPath=路径: "
  7. set "folderPath=%folderPath:"=%"
  8. if not exist "%folderPath%" (
  9.     goto GetFolder
  10. )
  11. set "filterChar1=A1"
  12. set "filterChar2=A2"
  13. pushd "%folderPath%"
  14. set "baseDir=!cd!"
  15. for /f "delims=" %%a in ('dir /b /s /a-d *.jpg') do (
  16.     set "fileName=%%~nxa"
  17.     echo !fileName! | find /i "!filterChar1!" >nul
  18.     if !errorlevel! equ 0 (
  19.         set "process=yes"
  20.     ) else (
  21.         echo !fileName! | find /i "!filterChar2!" >nul
  22.         if !errorlevel! equ 0 set "process=yes"
  23.     )
  24.     if defined process (
  25.         set "_path=%%~dpa"
  26.         setlocal enabledelayedexpansion
  27.         if /i "!_path:%DstDir%=!" equ "!_path!" (
  28.             set "_relpath=!_path:%baseDir%\=!"
  29.             if "!_relpath!"=="!_path!" (
  30.                 set "_relpath="
  31.             )
  32.             if defined _relpath (
  33.                 set "_relpath=!_relpath:\=-!"
  34.                 set "_relpath=!_relpath:~0,-1!"  
  35.             )
  36.             set "targetDir=%DstDir%"
  37.             if defined _relpath (
  38.                 set "targetDir=%DstDir%\!_relpath!"
  39.             )
  40.             if not exist "!targetDir!" (
  41.                 md "!targetDir!"
  42.             )
  43.             echo Y|move "%%a" "!targetDir!\%%~nxa" >nul
  44.         )
  45.         endlocal
  46.         set "process="
  47.     )
  48. )
  49. popd
  50. echo 文件已移动到 %DstDir%
  51. pause
复制代码
发表于 2025-6-5 14:52:02 | 显示全部楼层
  1. @echo off
  2. set list="*a1*.jpg" "*a2*.jpg"
  3. set "folder_to=d:\1"

  4. set /p folder_from=:

  5. for /f "delims=" %%a in ("%folder_from%") do (
  6.         pushd "%%~a"
  7.         for /r /d %%d in (*) do (
  8.                 set folder=%%d
  9.                 setlocal enabledelayedexpansion
  10.                 set "folder=!folder:%%~a\=!"
  11.                 robocopy "!folder!" "!folder_to!\!folder:\=-!" /mov !list!
  12.                 endlocal
  13.         )
  14.         popd
  15. )
  16. pause
复制代码
发表于 2025-6-5 21:04:23 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-6-5 21:07 编辑

回复 5# a6236130

通读了一遍5楼代码,在保留全部必要功能的基础上练了一版简化代码如下,仅供参考...

  1. @echo off
  2. set "DstDir=E:\1"
  3. if not exist "%DstDir%" md "%DstDir%"
  4. :GetFolder
  5.     set /p "folderPath=路径: "
  6.     set "folderPath=%folderPath:"=%"
  7.     if not exist "%folderPath%" goto GetFolder
  8.     if /i "%folderPath:~,4%"=="%DstDir%" goto GetFolder
  9. set "filterChar1=A1"
  10. set "filterChar2=A2"
  11. pushd "%folderPath%"
  12. for /f "delims=" %%a in ('dir /b/s/a-d "*%filterChar1%*.jpg" "*%filterChar2%*.jpg" ') do (
  13.     set "a=%%a" &set "nF=%%~nxa" &set "_path=%%~dpa"
  14.     setlocal enabledelayedexpansion
  15.     set "_relpath=!_path:%cd%\=!"
  16.     set "_relpath=!_relpath:\=-!"
  17.     set "_relpath=!_relpath:~0,-1!"
  18.     set "targetDir=%DstDir%\!_relpath!"
  19.     if not exist "!targetDir!" md "!targetDir!"
  20.     move /y "!a!" "!targetDir!\!nF!" >nul
  21.     endlocal
  22. )
  23. popd
  24. echo 文件已移动到 %DstDir%
  25. pause&exit/b
复制代码
 楼主| 发表于 2025-6-5 22:04:41 | 显示全部楼层
回复 7# aloha20200628


    感谢大哥,学习了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 11:51 , Processed in 0.019701 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表