Board logo

标题: [文件操作] 求助批处理移动遇相同向上递增计数 [打印本页]

作者: 娜美    时间: 2024-6-1 21:30     标题: 求助批处理移动遇相同向上递增计数

  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-1 23:05

本帖最后由 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
复制代码

作者: 77七    时间: 2024-6-1 23:54

论坛内很多此类问题帖子

http://www.bathome.net/thread-36991-1-1.html
作者: qixiaobin0715    时间: 2024-6-2 09:04

类似的,4楼代码:
http://bbs.bathome.net/thread-57444-1-1.html
作者: aloha20200628    时间: 2024-6-2 15:13

本帖最后由 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
复制代码

作者: 娜美    时间: 2024-6-2 15:17

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

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

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

回复 6# 娜美

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

作者: 娜美    时间: 2024-6-2 15:42

回复 7# aloha20200628


   5楼还没测, 我回复时还没看到有代码上来, 我马上试试哈
作者: 娜美    时间: 2024-6-2 15:55

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

回复 5# aloha20200628


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

请再修改一下我试试看 thanks
移动当前目录及子目录文件
for /r %path1% %%a in (*.txt *.rar *.zip *.jpg) do (....)
作者: aloha20200628    时间: 2024-6-2 16:15

回复 9# 娜美

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

作者: 77七    时间: 2024-6-2 16:54

回复 2# smss


   参考:不要在批处理for命令内部定义标签
作者: 77七    时间: 2024-6-2 17:02

回复 6# 娜美


   我不信请提供 path1、path2下的文件名,我试试。
作者: 娜美    时间: 2024-6-2 17:27

本帖最后由 娜美 于 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
复制代码

作者: 娜美    时间: 2024-6-2 17:45

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

回复 5# aloha20200628


   谢谢,  好了
作者: 77七    时间: 2024-6-2 18:02

本帖最后由 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
复制代码

作者: 娜美    时间: 2024-6-2 21:15

Ok thanks大家
作者: smss    时间: 2024-6-3 05:52

回复 6# 娜美 再试试2楼
作者: smss    时间: 2024-6-3 05:54

回复 11# 77七 用其它语言习惯了
作者: newswan    时间: 2024-6-3 09:31

如果原文件夹有

新建文本文档.txt
新建文本文档 (2).txt

如果目的文件夹有

新建文本文档 (4).txt
新建文本文档 (5).txt

如何排序
作者: 娜美    时间: 2024-6-3 10:56

回复  娜美 再试试2楼
smss 发表于 2024-6-3 05:52



报错呢
作者: 娜美    时间: 2024-6-3 10:58

本帖最后由 娜美 于 2024-6-3 14:59 编辑
如果原文件夹有

新建文本文档.txt
新建文本文档 (2).txt

如果目的文件夹有

新建文本文档 (4).txt ...
newswan 发表于 2024-6-3 09:31



    如果源文件夹,  目标文件夹,  都有相同名称, 这种情况5楼和15楼也是正确的,  它会递增命名
作者: 娜美    时间: 2024-6-3 11:00

回复 15# 77七


    嗯呐是对的, 不过最好能不使用goto跳转方法,  因为要插入脚本, 会影响其它工作
作者: aloha20200628    时间: 2024-6-3 14:16

本帖最后由 aloha20200628 于 2024-6-3 14:18 编辑

回复 21# 娜美

15楼代码的基本逻辑是不处理源文件夹存在形如 abc (2).txt 的文件(即不会分割根名和序号两个字段),故会出现 移动/复制 更名结果例如 abc (2)(...).txt 的文件名;其二是匹配更名规则不保留括号前的空格,与系统默认更名规则查了一个字符。

作者: 娜美    时间: 2024-6-3 14:50

本帖最后由 娜美 于 2024-6-3 15:04 编辑

回复 23# aloha20200628


   嗯你的5楼也对
但是不支持目录下有多个文件夹及子文件夹, 我偿试添加后 /s ('dir /s /b /a-d *.txt *.xlsx *.rar')
如果源目录下有多个文件夹及子文件夹  里面都有这些相同文件名称
  1. 新建文本文档 (2).txt
  2. 新建文本文档 (3).txt
复制代码
目标文件夹也有这些相同文件名称
  1. 新建文本文档 (2).txt
  2. 新建文本文档 (3).txt
复制代码
就会发生这种情况
  1. 新建文本文档 (2).txt
  2. 新建文本文档 (3).txt
  3. 新建文本文档 (4).txt
  4. 新建文本文档 (32).txt
  5. 新建文本文档 (232).txt
  6. 新建文本文档 (3232).txt
  7. 新建文本文档 (23232).txt
  8. 新建文本文档 (323232).txt
  9. 新建文本文档 (2323232).txt
  10. 新建文本文档 (32323232).txt
复制代码

作者: aloha20200628    时间: 2024-6-3 15:29

回复 24# 娜美

漏了一笔清零 5楼代码已订正,再试试吧...

作者: 娜美    时间: 2024-6-3 16:30

回复 25# aloha20200628


    漂亮, 正确了 thanks哦
作者: 77七    时间: 2024-6-7 21:53

回复 22# 娜美


   call 中的goto 有什么影响?
  1. http://bbs.bathome.net/redirect.php?goto=findpost&ptid=36991&pid=281494
复制代码





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