Board logo

标题: [文件操作] 批处理复制文件 重名 问题 [打印本页]

作者: swanseabrian    时间: 2021-12-14 10:29     标题: 批处理复制文件 重名 问题

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=:" %%i in ('dir /b /ad')  do (
  3.    
  4.     echo "%%i"
  5.     pushd "%%i"
  6.     for /f "delims=:" %%a in ('dir /b /a-d *.jpg') do (
  7. if not exist "%%~fi\%%a" (
  8. echo "%%~fa"
  9.                                 set name="%%~fa"
  10. copy /y  !name! "%%i")
  11. if  exist "%%~fi\%%a" (
  12. set name="%%~fa"
  13. echo  !name!>>D:\abc\1.txt)
  14. )   
  15.    popd
  16. )
  17. pause
复制代码
上面是我的代码,我的想法是

判断如果有重名的,不copy, 然后输出来一个文本里也就是D:\abc\1.txt,

如果不重名就copy ,

可以我设置了子目录里有重名的,没有输出,

这是啥情况 ,应该是覆盖了

情景 就是 ,

多个子目录里的jpg复制到子目录的根目录里去

,有可能会有重名,

这样应该怎么做呢
作者: qixiaobin0715    时间: 2021-12-14 12:07

本帖最后由 qixiaobin0715 于 2021-12-14 14:32 编辑
  1. @echo off
  2. (for /f "delims=" %%i in ('dir /b /ad') do (
  3.     pushd "%%i"
  4.     for /f "delims=" %%a in ('dir /b /a-d *.jpg') do (
  5.         if not exist "%~dp0%%a" (
  6.             copy "%%i" "%~dp0">nul
  7.         ) else (
  8.             echo,%%~fa
  9.         )
  10.     )
  11.     popd
  12. ))>"D:\abc\1.txt"
  13. pause
复制代码

作者: swanseabrian    时间: 2021-12-14 13:19

  1. @echo off
  2. (for /f "delims=" %%i in ('dir /b /ad') do (
  3.     pushd "%%i"
  4.     for /f "delims=" %%a in ('dir /b /s /a-d *.jpg') do (
  5.         if not exist "%%~fi\%%a" (
  6.             copy "%%a" "%%i">nul
  7.         ) else (
  8.             echo,%%~fa
  9.         )
  10.     )
  11.     popd
  12. ))>"D:\abc\1.txt"
  13. pause
复制代码
回复 2# qixiaobin0715

按你的我改了一下,但是没有输出出来,上面的是我想要的,但没有输出
作者: qixiaobin0715    时间: 2021-12-14 14:17

本帖最后由 qixiaobin0715 于 2021-12-14 14:22 编辑

如果有不存在的文件夹要先创建。
另外要注意有参数/s和没有参数/s,循环变量%%a的值有何差异。
作者: qixiaobin0715    时间: 2021-12-14 14:39

最好能说一下你的实际需求,刚刚注意到你的两段代码好像表达的意思不一样。由于代码错误,单从代码上看不知你到底想要如何。
作者: swanseabrian    时间: 2021-12-14 20:04

回复 5# qixiaobin0715

有个姓名的文件夹目录 ,张三 李四等等

每个姓名文件夹下面有

若干文件夹,这若干文件夹下面有可能还有文件夹,
现在就是要把姓名文件夹下面的 所有文件夹图片复制到   

姓名文件夹里,

也就是把图片从包括 的文件夹中复制出来
这么说可以理解吗
作者: swanseabrian    时间: 2021-12-14 20:05

回复 4# qixiaobin0715


    加/s是怕里面还有了文件夹不是
作者: swanseabrian    时间: 2021-12-14 20:10

回复 5# qixiaobin0715


    传网盘了,你看下
就是分别复制到名字的根目录去
链接:https://pan.baidu.com/s/1tiMDUHv3IORyISDGy8ozDA
提取码:1111
作者: qixiaobin0715    时间: 2021-12-14 20:15

本帖最后由 qixiaobin0715 于 2021-12-14 20:16 编辑
  1. @echo off
  2. (for /f "delims=" %%i in ('dir /b /ad') do (
  3.     pushd "%%i"
  4.     for /f "delims=" %%a in ('dir /s /b /a-d *.jpg') do (
  5.         if not exist "%%~nxa" (
  6.             copy "%%a">nul
  7.         ) else (
  8.             echo,%%a
  9.         )
  10.     )
  11.     popd
  12. ))>"D:\abc\1.txt"
  13. pause
复制代码
未测试
作者: swanseabrian    时间: 2021-12-14 20:32

回复 9# qixiaobin0715


    if not exist "%%~fi\%%a" (
            copy "%%a" "%%i">nul
这么写为啥有问题??
作者: qixiaobin0715    时间: 2021-12-14 20:42

回复 10# swanseabrian
你已经通过pushd将路径标记在了%%i文件夹下,如果在写一个%%i就相当于将文件复制在你刚标记的目录下的名字为“%%i”的文件夹(路径下的子文件夹)里面。
作者: swanseabrian    时间: 2021-12-14 20:42

回复 9# qixiaobin0715


     if not exist "%%~nxa"
if not exist "%%~fi\%%a"
这两句不是一个意思吗?
作者: swanseabrian    时间: 2021-12-14 20:44

回复 11# qixiaobin0715


    这个确实 是比较 神奇的地方,确实没有概念
作者: qixiaobin0715    时间: 2021-12-14 20:54

回复 12# swanseabrian
实际上这个问题在4楼已做过说明,你在此处加两行代码就明白了:
  1. echo,%%~nxa
  2. echo,%%~fi\%%a
  3. pause
复制代码

作者: swanseabrian    时间: 2021-12-14 22:16

回复 14# qixiaobin0715


    也就是说 push到目录下之后,对目录之外的操作是不对的,对吧
作者: qixiaobin0715    时间: 2021-12-14 22:29

回复 15# swanseabrian
没说到点子上,你非要这么折腾也行,将9楼代码5~6行改为:
  1.         if not exist "%%~fi\%%~nxa" (
  2.             copy "%%a" "%%~fi">nul
复制代码
但是这样不是多此一举吗。
作者: qixiaobin0715    时间: 2021-12-14 22:34

本帖最后由 qixiaobin0715 于 2021-12-14 22:36 编辑

要注意加上参数/s后,%%a的值是带有路径的。所以要取文件名及扩展名,即%%~nxa。否则的话,这样写%%~fi\%%a,就会乱套的。
作者: swanseabrian    时间: 2021-12-15 11:01

回复 17# qixiaobin0715


    这个知识点确实不知道啊,所以有点乱套,多谢谢大神




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