Board logo

标题: [文件操作] [已解决]批处理如何复制文件同名不覆盖,且重命名? [打印本页]

作者: qq872862088    时间: 2015-8-20 00:56     标题: [已解决]批处理如何复制文件同名不覆盖,且重命名?

  1. for /f "delims=" %%a in ('dir /b /s .\*.txt') do (
  2. copy  "%%a" .\new /-y
  3. )
复制代码
上述代码只能提醒是否覆盖,我想实现同名文件如F:\1.txt和F:\1\1.txt拷进同一文件夹时,后拷的1.txt变成1(1).txt,求指教
作者: DAIC    时间: 2015-8-20 09:17

批处理复制或重命名文件的时候对重复文件依次添加数字序号
http://bbs.bathome.net/viewthread.php?tid=9355#pid60621
http://bbs.bathome.net/viewthread.php?tid=11423#pid72681
作者: WHY    时间: 2015-8-20 11:01

本帖最后由 WHY 于 2015-8-21 15:50 编辑

一种思路:
把当前目录(包括子目录)的所有文件复制到 d:\new文件夹,遇到同名文件时,自动增加(1)、(2)等编号
如果只需要复制指定类型的文件,修改第4行的 *.* 即可。比如改成 *.txt 就只复制扩展名为txt的文件
  1. 1<1/* :
  2. @echo off
  3. md d:\new 2>nul
  4. for /f "tokens=1*delims=/" %%i in ('dir /b /s /a-d *.*^|cscript //Nologo //E:jscript "%~f0"')do (
  5.     copy "%%j" "d:\new\%%i"
  6. )
  7. pause & exit
  8. */
  9. var map = {};
  10. var str = WScript.StdIn.ReadAll().replace(
  11.     /.+\\(.+)\r\n/g,
  12.     function(a,b){
  13.         var s = '', n = b.toLowerCase();
  14.         map.hasOwnProperty(n)?(map[n]++,s='('+map[n]+')'):map[n]=0;
  15.         b = b.replace(/(.+?)(\.[^.]+|)$/, '$1'+s+'$2');
  16.         return(b + '/' + a);
  17.     }
  18. )
  19. WScript.Echo(str)
复制代码

作者: pcl_test    时间: 2015-8-20 11:36

本帖最后由 pcl_test 于 2015-8-20 11:42 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /b /s *.txt') do (
  3.     set "fn=%%~nxa"
  4.     set "fn=!fn: =_!"
  5.     if defined #!fn! (
  6.         for %%i in (!fn!) do copy "%%a" "new\%%~na(!#%%i!)%%~xa"
  7.     ) else copy "%%a" "new\"
  8.     set/a #!fn!+=1
  9. )
  10. pause
复制代码

作者: WHY    时间: 2015-8-20 13:28

回复 4# pcl_test


    文件名含 +-~() 等字符呢?
作者: WHY    时间: 2015-8-20 13:31

for + call 方案,但效率绝逼不高
  1. @echo off
  2. for /r %%i in (*) do (
  3.     set "strName=%%~nxi" & set "n="
  4.     call :CP "%%i"
  5. )
  6. pause & exit
  7. :CP
  8. if not exist "d:\new\%strName%" copy "%~1" "d:\new\%strName%" & goto :EOF
  9. if exist "d:\new\%strName%" set /a n+=1
  10. set "strName=%~n1(%n%)%~x1"
  11. goto :CP
复制代码

作者: qq872862088    时间: 2015-8-20 15:08

回复 4# pcl_test


    文件覆盖了,cmd里出现“运算符不存在”这种问题,我电脑问题吗?
作者: pcl_test    时间: 2015-8-20 15:15

本帖最后由 pcl_test 于 2015-8-20 15:17 编辑

回复 5# WHY

这种方法是有此弊端的,但对于一般的文件名,效果却是极好,故也提一下
回复 7# qq872862088
不是,只是文件名有特殊字符而已
作者: qq872862088    时间: 2015-8-20 15:18

回复 6# WHY


    测试过,只有2个同名文件,但新文件夹出现3个同名文件,还有for /r %%i in (*) do里的*改成'dir /b /s *.txt'找不到指定文件...不知道怎么改
作者: qq872862088    时间: 2015-8-20 15:22

回复 8# pcl_test


    的确,没有特殊字符就很好用,但我的文件名大多都是以日期起名的,都带有空格,有什么好方法吗
作者: pcl_test    时间: 2015-8-20 15:33

回复 10# qq872862088

空格不影响,该是其他字符影响

3楼的dir /b /s /a-d改为dir /b /s /a-d *.txt
或6楼in (*)改为in (*.txt)皆可
作者: qq872862088    时间: 2015-8-20 15:42

回复 11# pcl_test


    文件名格式就是这样,果然是-号
作者: qq872862088    时间: 2015-8-20 15:51

本帖最后由 qq872862088 于 2015-8-20 15:55 编辑

回复 3# WHY


    3楼和11楼完美解决了我的问题了,感谢感谢
作者: CrLf    时间: 2015-8-20 20:54

回复 4# pcl_test


    for %%i in (!fn!) do
这里有隐患
作者: WHY    时间: 2015-8-21 16:20

另外一种办法:
  1. @echo off & setlocal enabledelayedexpansion   
  2. if not "%~1"==":" (
  3.     md d:\new 2>nul
  4.     for /f "tokens=1*delims=/" %%i in ('"%~f0" :^|sort') do (
  5.         if /i "%%i"=="!strName!" (
  6.             set /a n+=1
  7.             copy "%%j" "d:\new\%%~ni(!n!)%%~xi"
  8.         ) else (
  9.             set "n="
  10.             copy "%%j" d:\new\
  11.         )
  12.         set "strName=%%i"
  13.     )
  14.     pause
  15. ) else (
  16.     for /r %%i in (*) do echo %%~nxi/%%i
  17. )
复制代码

作者: 77七    时间: 2024-6-7 21:45

  1. @echo off
  2. set f1=d:\from
  3. set f2=d:\to
  4. cd /d "%f1%"
  5. for /f "delims=" %%i in ('2^>nul dir /b /s /a-d *.txt *.rar') do (
  6. set f=%%i
  7. set nx=%%~nxi
  8. set x=%%~xi
  9. set n=1
  10. call :1 "%%~nxi"
  11. )
  12. pause
  13. exit
  14. :1
  15. for /f "tokens=1* delims=(" %%a in ("%~1") do (
  16. if "%%b" neq "" (
  17. call :1 "%%b"
  18. ) else (
  19. for /f "tokens=* delims=0123456789" %%c in ("%%a") do (
  20. if "%%c" equ ")%x%" (
  21. call set "str=%%nx:(%%a=%x%%%"
  22. ) else (
  23. set "str=%nx%"
  24. )
  25. setlocal enabledelayedexpansion
  26. for /f "delims=" %%e in ("!str!") do (
  27. endlocal
  28. call :2 "%%e"
  29. )
  30. )
  31. )
  32. )
  33. exit /b
  34. :2
  35. set /a n+=1
  36. if not exist "%f2%\%~n1%~x1" (
  37. copy "%f%" "%f2%\%~n1%~x1"
  38. ) else if not exist "%f2%\%~n1(%n%)%~x1" (
  39. copy "%f%" "%f2%\%~n1(%n%)%~x1"
  40. ) else (
  41. goto :2
  42. )
  43. exit /b
复制代码

作者: aloha20200628    时间: 2024-6-8 17:02

本帖最后由 aloha20200628 于 2024-6-8 17:10 编辑


本帖楼主的原意是将多个子目录中的同名文件复制到目标目录时须作更名处理,其更名格式如 *(1).*,因源文件不包含类似 *(1).* 的文件,故解法要比另帖(http://www.bathome.net/thread-69152-1-1.html)来的轻快,但若假定源文件名可能包含 !&^ 等特殊字符时,其解法则须另辟捷径了》既要放弃延迟变量(以便兼容源文件名中的特殊字符),又要在循环中采用计数器(以便顺序匹配目标文件名),还要逃避复合语块中%n%变量的预处理...
  1. @echo off &set "d1=c:\源目录" &set "d2=d:\目标目录"
  2. pushd "%d2%"
  3. for /f "delims=" %%a in (' dir /b/s/a-d "%d1%\*.txt" ') do (
  4. if not exist "%%~nxa" (copy "%%a") else (
  5. set/a "n=1" &set "F=%%a" &set "nF=%%~na" &set "xF=%%~xa"
  6. (call :copy#n)
  7. )
  8. )
  9. popd &pause &exit/b
  10. :copy#n
  11. if exist "%nF%(%n%)%xF%" (set/a "n+=1" &goto :copy#n)
  12. copy "%F%" "%nF%(%n%)%xF%" &exit/b
复制代码

作者: newswan    时间: 2024-6-8 21:04

powershell 不必纠结 bat 特殊字符
  1. $sour = ".\old"
  2. $dest = ".\new"
  3. $ext = "*.txt"
  4. Get-ChildItem -Path $sour -Filter $ext | ForEach-Object {
  5. if ( -Not (Test-Path ( Join-Path  -Path $dest  -ChildPath $_.Name )) ) {
  6. Copy-Item  -Path $_.FullName  -Destination ( Join-Path -Path $dest -ChildPath $_.Name )
  7. } else {
  8. $i = 0
  9. do {
  10. $i++
  11. }
  12. while ( Test-Path ( Join-Path -Path $dest -ChildPath ($_.BaseName + $i + $_.Extension) ) )
  13. Copy-Item  -Path $_.FullName  -Destination ( Join-Path -Path $dest -ChildPath ($_.BaseName + $i + $_.Extension) )
  14. }
  15. }
复制代码

作者: aloha20200628    时间: 2024-6-8 22:15

本帖最后由 aloha20200628 于 2024-6-9 00:11 编辑

回复 18# newswan

每家都有几曲乡愁,彼此彼此,一方水土养一方人,苦乐痛痒其实一脉相通...





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