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

[文件操作] 求助批处理移动遇相同向上递增计数

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set path1=C:\2
  4. set path2=D:\3
  5. for /r %path1% %%a in (*.txt) do (
  6. if not exist "%path2%\%%~nxa" (move "%%a" "%path2%\") else (
  7. if not exist "%path2%\%%~na(2)%%~xa" (move "%%a" "%path2%\%%~na(2)%%~xa") else (
  8. set n=2
  9. for /f "delims=" %%b in ('dir /b /a-d %path2%\*^|findstr /r /be /c:"%%~na ([0-9][0-9]*)%%~xa"') do (
  10. set "str=%%~nb"
  11. set "m=!str:%%~na (=!"
  12. set "m=!m:)=!"
  13. if !m! gtr !n! set /a n=m
  14. )
  15. set /a n+=1
  16. move "%%a" "%path2%\%%~na(!n!)%%~xa"
  17. )
  18. )
  19. )
  20. endlocal
  21. pause
  22. 移动文件时遇相同向上计数递增, 现在是感觉不太科学
  23. 新建文本文档(2).txt
  24. 新建文本文档(2)(2).txt
  25. 新建文本文档(2)(2)(2).txt
  26. 新建文本文档(2)(2)(2)(2).txt
复制代码
希望写成像windows那样向上计数递增
新建文本文档.txt
新建文本文档 (2).txt
新建文本文档 (3).txt
新建文本文档 (4).txt
新建文本文档 (5).txt

本帖最后由 smss 于 2024-6-3 06:39 编辑
  1. @echo off&setlocal enabledelayedexpansion&set "a=c:\2"&set "b=d:\3"
  2. for /r "%a%" %%i in (*)do set n=0&set "f=%%~ni"&set "e=%%~xi"set "M=%%i"&set "W=!b!\!f!!e!"&call :loop
  3. pause
  4. :loop
  5. if not exist "!W!" (move "!M!" "!W!")else set /a n+=1&set "W=!b!\!f!(!n!)!e!"&goto :loop
  6. goto :eof
复制代码

TOP

论坛内很多此类问题帖子

http://www.bathome.net/thread-36991-1-1.html
bat小白,请多指教!谢谢!

TOP

TOP

本帖最后由 aloha20200628 于 2024-6-3 15:26 编辑

回复 1# 娜美

以下代码可处理源文件名与目标文件名的重复情况-举例如下:
        源文件夹中要移至目标文件夹的文件是》abc.txt,abc (2).txt
        目标文件夹已存在的文件是》abc.txt,abc (2).txt,abc (3).txt
        处理结果是目标文件夹新增两个文件》abc (4).txt,abc (5).txt
代码第12行数字 -5 管控文件名序号长度(2-999),绝对值增加则长度增加
  1. @echo off &setlocal enabledelayedexpansion
  2. set "path1=C:\2" &set "path2=D:\3" &pushd "!path1!"
  3. for /f "delims=" %%F in ('dir /b/a-d *.txt *.rar *.zip *.jpg *.mp4') do (
  4. if not exist "!path2!\%%~nxF" (move "%%F" "!path2!\") else (
  5. (call :get#nF "%%~nF" nFn n) & (call :check#2F nFn "%%~xF" !n! qF)
  6. move "%%F" "!path2!\!nFn!(!qF!)%%~xF"
  7. )
  8. )
  9. popd&endlocal&exit/b
  10. :get#nF //REM 获取源文件名序号锚点
  11. set "_nF=%~1" &if "!_nF:~-1!" neq ")" (set "%~2=%~1 " &set "%~3=2" &exit/b)
  12. set "_k=" &for /L %%k in (-2,-1,-5) do (
  13. set "c=!_nF:~%%k,1!"
  14. if "!c!"=="(" (set "%~2=!_nF:~0,%%k!" &set "%~3=!_k!" &exit/b) else (
  15. if "!c!" geq "0" if "!c!" leq "9" set "_k=!c!!_k!"
  16. )
  17. )
  18. exit/b
  19. :check#2F //REM 验证目标文件名不重复序号
  20. set "_qF=%~3"
  21. :[Loop]
  22. if exist "!path2!\!%~1!(!_qF!)%~2" (set/a "_qF+=1" &goto[Loop])
  23. set "%~4=!_qF!" &exit/b
复制代码

TOP

本帖最后由 娜美 于 2024-6-2 15:23 编辑

各位大哥哥
以上都不符合哦

所有命令或连接都试了,  仅只能执行移动文件1次,  如果再次执行移动命令 或 不断重复执行命令就失效了, 说明移动文件遇到相同名称都不具有向上递增计数命名功能
还需考虑多扩展文件类型txt jpg rar zip 等
for /r %path1% %%a in (*.txt *.rar) do (....)

TOP

回复 6# 娜美

楼主的实际情况与5楼代码的测试举例有何区别?

TOP

回复 7# aloha20200628


   5楼还没测, 我回复时还没看到有代码上来, 我马上试试哈

TOP

本帖最后由 娜美 于 2024-6-2 16:05 编辑

回复 5# aloha20200628


   大哥哥这个写得很好,  计数递增命名格式正确,  虽然我看不太懂.  看上去很科学,   但扩展名只能一种*.txt吗 ?   考虑一下增加支持多扩展名就好了 *.txt rar zip jpg mp4 等等

请再修改一下我试试看 thanks
移动当前目录及子目录文件
for /r %path1% %%a in (*.txt *.rar *.zip *.jpg) do (....)

TOP

回复 9# 娜美

订正了5楼代码,增加了多种文件类型匹配...

TOP

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

TOP

回复 6# 娜美


   我不信请提供 path1、path2下的文件名,我试试。
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2024-6-2 17:46 编辑

回复 12# 77七



1-4楼的连接及所有子连接都试过  用的最简单文件名称测试的, 没有任何特殊符号的,   
  1. D:\A
  2. D:\B
复制代码

  1. D:\A\新建文本文档.txt
  2. D:\A\1.txt
复制代码

  1. D:\B\新建文本文档.txt
  2. D:\B\1.txt
复制代码

TOP

本帖最后由 娜美 于 2024-6-2 18:10 编辑

回复 5# aloha20200628


   谢谢,  好了

TOP

本帖最后由 77七 于 2024-6-2 18:13 编辑

回复 13# 娜美


   我测试了http://www.bathome.net/redirect.php?goto=findpost&;ptid=36991&pid=173326,是对的,其余未测试。使用代码需要一些基础知识,比如 更改工作路径(cd)、copy改move等。
  1. @echo off
  2. rem "http://www.bathome.net/redirect.php?goto=findpost&ptid=36991&pid=173326"
  3. cd /d "d:\A"
  4. for /r %%i in (*) do (
  5.     set "strName=%%~nxi" & set "n="
  6.     call :CP "%%i"
  7. )
  8. pause & exit
  9. :CP
  10. if not exist "d:\B\%strName%" move "%~1" "d:\B\%strName%" & goto :EOF
  11. if exist "d:\B\%strName%" set /a n+=1
  12. set "strName=%~n1(%n%)%~x1"
  13. goto :CP
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表