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

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

本帖最后由 剑气如霜 于 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分别复制到对应安装目录下。

  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

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 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

评分人数

微信:flashercs
QQ:49908356

TOP

本帖最后由 剑气如霜 于 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路径
隔行如隔山,个人搞不来这种问题,只能求助各位,谢谢!

TOP

  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

评分人数

微信:flashercs
QQ:49908356

TOP

搞定,谢谢!测试的时候发现一些奇怪的彩蛋,winxp不支持同时查找2个路径,win7及以上就可以。然后第9行的MD命令删掉也可以,xcopy应该是具备复制+同时创建路径的功能。因为实际环境的规则比例子复杂,比如实际中software有3个空格,然后实际<版本号 1.5>对应的是<DATA_1_5>等等,给大家添麻烦也不好意思,最后还是用回3L的代码,把特例手动写进去完工。

TOP

可以试试2楼代码,其中4-10行,没有采用分隔符切割文件名缩短代码,用了多个if,本意为方便楼主自定义修改。(早已预判
因标题中表明是复制文件,故用的copy,可以改为
  1. robocopy "DATA_1.0" "%%d\DATA_1.0" /e
复制代码
bat小白,请多指教!谢谢!

TOP

回复 7# 77七
我以前自己写的就是多个if的写法,这种方式不能自动匹配版本,比如明年软件出了个新版本,然后设置了<DATA_新版本>以后,还要回头在批处理里面添加对应的版本号,3L或者5L的这种方式更适合我的环境。用xcopy是因为DATA里面包含文件夹,用copy无法实现,不用robocopy是因为winxp无此命令,代码的兼容性很重要。谢谢你的热心帮助。

TOP

回复 8# 剑气如霜


   如果software是不变的,做个变量替换就行。
bat小白,请多指教!谢谢!

TOP

返回列表