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

[文件操作] [已解决]批处理怎样查找多个文件夹分别复制文件?

[复制链接]
发表于 2025-1-2 11:28:51 | 显示全部楼层 |阅读模式
本帖最后由 剑气如霜 于 2025-1-3 16:56 编辑

举例:
C:\Program Files\xxx\software_版本号
C:\Program Files(x86)\xxx\software_版本号
<software_版本号>可能安装在Program Files,也可能安装在Program Files(x86),版本可能是software_1.0,software_2.5,software_10多个版本同时存在,把DATA_1.0,DATA_2.5,DATA_10,用xcopy分别复制到对应安装目录下。
发表于 2025-1-2 18:42:44 | 显示全部楼层
  1. @echo off & cd /d "%~dp0" & fltmc >nul || (powershell -Command "Start-Process '%~f0' -Verb RunAs" & exit /b)
  2. rem 保存为ansi编码
  3. for /f "delims=" %%d in ('dir /b /s /ad "C:\Program Files\software_*" "C:\Program Files (x86)\software_*"') do (
  4.         if /i "%%~nxd" equ "software_1.0" (
  5.                 copy "DATA_1.0" "%%d"
  6.         ) else if /i "%%~nxd" equ "software_2.5" (
  7.                 copy "DATA_2.5" "%%d"
  8.         ) else if /i "%%~nxd" equ "software_10" (
  9.                 copy "DATA_10" "%%d"
  10.         )
  11. )
  12. pause
复制代码

假设 C:\Program Files C:\Program Files (x86) 均已存在

评分

参与人数 1技术 +1 收起 理由
剑气如霜 + 1 热心助人

查看全部评分

发表于 2025-1-2 18:49:06 | 显示全部楼层
本帖最后由 flashercs 于 2025-1-3 12:52 编辑
  1. @echo off
  2. cd /d "%~dp0"
  3. for /d %%A in ("C:\Program Files\xxx\software_*" "C:\Program Files (x86)\xxx\software_*") do (
  4.   for /f "tokens=1* delims=_" %%B in ("%%~nxA") do (
  5.     if exist "DATA_%%~C" (
  6.       md "%%~A\DATA_%%~C" 2>nul
  7.       xcopy "DATA_%%~C\*" "%%~A\DATA_%%~C" /E /H /R
  8.     )
  9.   )
  10. )
  11. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
剑气如霜 + 1 很好

查看全部评分

 楼主| 发表于 2025-1-3 08:34:51 | 显示全部楼层
本帖最后由 剑气如霜 于 2025-1-3 08:35 编辑

谢谢2位朋友的帮助!3楼的代码很智能,非常好用。在这里能不能延伸一下问题,如果<software 版本号>这种以空格来区分的文件夹该如何判断?然后如果xcopy最后要复制的目标路径是%allusersprofile%\Application Data\xxx\DATA 版本号,该如何修改代码?
比如查找到"C:\Program Files\xxx\software 2.5"
用xcopy复制DATA 2.5文件夹到%allusersprofile%\Application Data\xxx\software 2.5\DATA 2.5路径
隔行如隔山,个人搞不来这种问题,只能求助各位,谢谢!
发表于 2025-1-3 12:52:06 | 显示全部楼层
  1. @echo off
  2. cd /d "%~dp0"
  3. REM 设置software分隔符 _或空格
  4. set "delims= "

  5. for /d %%A in ("C:\Program Files\xxx\software%delims%*" "C:\Program Files (x86)\xxx\software%delims%*") do (
  6.   for /f "tokens=1* delims=%delims%" %%B in ("%%~nxA") do (
  7.     if exist "DATA%delims%%%~C" (
  8.       md "%allusersprofile%\Application Data\xxx\software%delims%%%~C\DATA%delims%%%~C" 2>nul
  9.       xcopy "DATA%delims%%%~C\*" "%allusersprofile%\Application Data\xxx\software%delims%%%~C\DATA%delims%%%~C" /E /H /R
  10.     )
  11.   )
  12. )

  13. pause
  14. exit /b
复制代码

评分

参与人数 1技术 +1 收起 理由
剑气如霜 + 1 解决问题

查看全部评分

 楼主| 发表于 2025-1-3 16:52:59 | 显示全部楼层
搞定,谢谢!测试的时候发现一些奇怪的彩蛋,winxp不支持同时查找2个路径,win7及以上就可以。然后第9行的MD命令删掉也可以,xcopy应该是具备复制+同时创建路径的功能。因为实际环境的规则比例子复杂,比如实际中software有3个空格,然后实际<版本号 1.5>对应的是<DATA_1_5>等等,给大家添麻烦也不好意思,最后还是用回3L的代码,把特例手动写进去完工。
发表于 2025-1-3 17:23:49 | 显示全部楼层
可以试试2楼代码,其中4-10行,没有采用分隔符切割文件名缩短代码,用了多个if,本意为方便楼主自定义修改。(早已预判
因标题中表明是复制文件,故用的copy,可以改为
  1. robocopy "DATA_1.0" "%%d\DATA_1.0" /e
复制代码
 楼主| 发表于 2025-1-4 08:11:16 | 显示全部楼层
回复 7# 77七
我以前自己写的就是多个if的写法,这种方式不能自动匹配版本,比如明年软件出了个新版本,然后设置了<DATA_新版本>以后,还要回头在批处理里面添加对应的版本号,3L或者5L的这种方式更适合我的环境。用xcopy是因为DATA里面包含文件夹,用copy无法实现,不用robocopy是因为winxp无此命令,代码的兼容性很重要。谢谢你的热心帮助。
发表于 2025-1-4 11:00:22 | 显示全部楼层
回复 8# 剑气如霜


   如果software是不变的,做个变量替换就行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 15:21 , Processed in 0.020619 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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