Board logo

标题: [文件操作] 【已解决】批处理怎样把文件或文件夹复制到某路径下带关键字(多个)的文件夹中 [打印本页]

作者: toyerspollors    时间: 2021-2-20 22:45     标题: 【已解决】批处理怎样把文件或文件夹复制到某路径下带关键字(多个)的文件夹中

本帖最后由 toyerspollors 于 2021-2-26 16:31 编辑
  1. @echo off
  2. set F=%date:~5,2%%date:~8,2%
  3. md ".\%F%总文件夹\432 小张-小红-s5"
  4. md ".\%F%总文件夹\673 大军-阿四-01"
  5. md ".\%F%总文件夹\gg3 大军-小冰-77"
  6. md ".\%F%总文件夹\8lr 小齐-大宝-41"
  7. md ".\%F%总文件夹\623 李哥-三弟-5y"
  8. md ".\测试1 复制-目标-2"
  9. md ".\测试2 复制-目标(基友)-2"
  10. md ".\测试2 复制-目标(基友)-2\123"
  11. echo >".\测试1 复制-目标-2\list.txt"
  12. echo >".\测试2 复制-目标(基友)-2\list2.txt"
  13. echo >".\测试3 复制-list-8.txt"
  14. echo >".\测试4 复制-test(基友)-97.docx"
  15. echo >".\测试2 复制-目标(基友)-2\11\df3d 基友-小萧-66.mp3"
  16. cls
  17. :top
  18. echo.
  19. echo.
  20. echo.
  21. set /p 源文件=把要复制的文件拖拽进来==》
  22. set 输出目标路径=.\%F%总文件夹
  23. set F=%date:~5,2%%date:~8,2%
  24. for /f "tokens=*" %%a in ('dir /ad/b ".\%输出目标路径%"') do (
  25. xcopy "%源文件%" /y ".\%输出目标路径%\%%a\"
  26. )
  27. pause
  28. goto :top
复制代码
新手求学

    上面代码前面16行是创建好测试需要用到的文件夹层级和文件。22-28行,实现的效果是,运行bat文件后,把要复制的文件拖到黑色窗口上,确认后会把拖拽进来的文件复制到“%F%总文件夹”这个目录层级下的所有文件夹中(不遍历所有子级)。

    问题1:我只是会写以上复制文件的代码,但是我也想用这种拖拽到窗口的方式来复制文件夹,把文件夹复制到“%F%总文件夹”这个目录层级下的所有文件夹中(不遍历所有子级)。不知道怎么写?能否在一个bat中兼顾到既能复制文件,又能复制文件夹呢?

    问题2: 我想实现把文件或文件夹复制到带有关键字(多个)的文件夹中,例如“%F%总文件夹”这个目录层级下有多个文件夹,但是我只想复制给文件夹的命名带有关键字“大军“、”三弟“的文件夹里,不知道如何编写代码?复制文件夹的话,要把整个主目录文件夹复制过去,而不是只复制主目录里面的子文件夹和文件。关键字是能直接写在代码上的,不要使用调用txt文档来识别关键字。

    注意:
    我的操作是,把要复制的文件或文件夹拖拽到运行后的bat窗口中,而不是直接拖到bat文件的图标上。
    另外测试的“源文件(文件夹)”和“%F%总文件夹”目录层级下的文件夹在命名上是带有空格字符的,代码要支持带有空格字符。

    希望老师们帮助一下,让我借此也能学习一些bat知识,谢谢!
作者: toyerspollors    时间: 2021-2-24 09:44

本帖最后由 toyerspollors 于 2021-2-24 09:48 编辑

效果实例
smss 发表于 2021-2-23 10:57
  1. set /p 源文件=把要复制的文件拖拽进来==》
  2. set 输出目标路径=.\%F%总文件夹
  3. set F=%date:~5,2%%date:~8,2%
  4. for /f "tokens=*" %%a in ('dir /ad/b ".\%输出目标路径%"') do (
  5. xcopy "%源文件%" /y ".\%输出目标路径%\%%a\"
  6. )
复制代码
首先谢谢老师在百忙中给予帮助!
但我需要的操作是,把要复制的文件或文件夹拖拽到运行后的bat窗口中,如以上代码的效果。而不是直接拖到bat文件的图标上实现复制。

你给出的代码我测试不成功,我是先把要复制的文件拖拽到你这个代码的bat文件图标上,然后输入最后输出复制到哪个文件夹的关键字。确认后产生的效果是会在bat文件目录下,自动生成一个以当天日期命名的文件夹,然后要复制的东西会复制到这个新创建的文件夹中。但本人新手表示看不懂你这些复杂的代码,不会去修改满足自己的需要。

在1楼我重新编辑了问题内容,可能会比之前好理解一些了。
作者: cutebe    时间: 2021-2-24 14:47

一思路、判断一下目录/文件 区别对待,复制整个目录用xcopy /y /e /i,复制文件用copy /y
二思路、没有特殊字符的话,关键字用 字符替换对比 / findstr查找识别 过滤出来
作者: toyerspollors    时间: 2021-2-24 15:13

本帖最后由 toyerspollors 于 2021-2-24 15:15 编辑

回复 4# cutebe


暂时还没学会使用 / findstr ,  问题2的代码能帮写一下吗?源文件(文件夹)与带有关键字的文件夹都是有空格的,谢谢!
作者: smss    时间: 2021-2-24 17:17

本帖最后由 smss 于 2021-2-24 17:32 编辑
  1. @Echo off&SetLocal EnableDelayedExpansion&if "%~1"=="" echo 拖拽目标至%~n0即可&ping 0 -n "3">nul&exit
  2. set "X=%~a1"&set F=%date:~5,2%%date:~8,2%总文件夹&if not exist %~dp0!F! md %~dp0!F!
  3. if "!X:~0,1!"=="d" (xcopy /ciserh "%~1" "%~dp0!F!\%~n1"&goto A)else (set /p Y=把该文件放入如"大军"和"大宝"的文件夹中请输文件夹名:
  4. if not exist "%~dp1!F!\!Y!" md "%~dp1!F!\!Y!"
  5. copy "%~1" "%~dp1!F!\!Y!\%~nx1")
  6. :A
  7. echo 复制完毕!&ping 0 -n "2">nul&exit
复制代码
  1. @Echo off&SetLocal EnableDelayedExpansion&if "%~1"=="" set /p X=拖拽目标至%~n0回车确认即可
  2. set F=%date:~5,2%%date:~8,2%总文件夹&if not exist %~dp0!F! md %~dp0!F!
  3. set /p Y=把该文件放入!F!下指定文件夹:
  4. if not exist "%~dp1!F!\!Y!" md "%~dp1!F!\!Y!"
  5. copy "%~1" "%~dp1!F!\!Y!\%~nx1"||xcopy /ciserh "%~1" "%~dp0!F!\!Y!\%~n1"
  6. echo 复制完毕!&ping 0 -n "2">nul&exit
复制代码

作者: cutebe    时间: 2021-2-24 17:30

复制到所有一级子目录
  1. ::复制文件/目录到目标一级子目录
  2. @echo off
  3. :top
  4. set /p 源文件=把要复制的文件拖拽进来==》
  5. set F=%date:~5,2%%date:~8,2%
  6. set "输出目标路径=%F%总文件夹"
  7. call :fdcopy %源文件% "%输出目标路径%"
  8. goto :top
  9. :fdcopy 源 目标
  10. for /f "delims=" %%a in ('dir /ad/b "%~2"') do (
  11. if exist "%~1\" (
  12. xcopy /y/e/i "%~1" "%~2\%%a\%~nx1"
  13. )else copy /y "%~1" "%~2\%%a"
  14. )
  15. goto :eof
复制代码
仅复制到关键字子目录
  1. ::复制文件/目录到目标一级关键字子目录
  2. @echo off
  3. :top
  4. set /p 源文件=把要复制的文件拖拽进来==》
  5. set F=%date:~5,2%%date:~8,2%
  6. set "输出目标路径=%F%总文件夹"
  7. call :fdcopy %源文件% "%输出目标路径%"
  8. goto :top
  9. :fdcopy 源 目标
  10. set "关键字1=673 大军"
  11. set "关键字2=8lr 小齐"
  12. for /f "delims=" %%a in ('"dir /ad/b "%~2"|findstr /ic:"%关键字1%" /c:"%关键字2%""') do (
  13. if exist "%~1\" (
  14. xcopy /y/e/i "%~1" "%~2\%%a\%~nx1"
  15. )else copy /y "%~1" "%~2\%%a"
  16. )
  17. goto :eof
复制代码

作者: toyerspollors    时间: 2021-2-26 16:32

复制到所有一级子目录仅复制到关键字子目录
cutebe 发表于 2021-2-24 17:30



    6楼的代码解决了我的问题,谢谢!
作者: toyerspollors    时间: 2021-2-26 16:34

smss 发表于 2021-2-24 17:17



    我测试了你的代码,可能是我不会使用吧,没能成功,我也看不懂,感觉乱乱的,不太会查找错误的地方去修改。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2