标题: [文件操作] 求助批处理移动遇相同向上递增计数 [打印本页]
作者: 娜美 时间: 2024-6-1 21:30 标题: 求助批处理移动遇相同向上递增计数
- @echo off
- setlocal enabledelayedexpansion
- set path1=C:\2
- set path2=D:\3
- for /r %path1% %%a in (*.txt) do (
- if not exist "%path2%\%%~nxa" (move "%%a" "%path2%\") else (
- if not exist "%path2%\%%~na(2)%%~xa" (move "%%a" "%path2%\%%~na(2)%%~xa") else (
- set n=2
- for /f "delims=" %%b in ('dir /b /a-d %path2%\*^|findstr /r /be /c:"%%~na ([0-9][0-9]*)%%~xa"') do (
- set "str=%%~nb"
- set "m=!str:%%~na (=!"
- set "m=!m:)=!"
- if !m! gtr !n! set /a n=m
- )
- set /a n+=1
- move "%%a" "%path2%\%%~na(!n!)%%~xa"
- )
- )
- )
- endlocal
- pause
- 移动文件时遇相同向上计数递增, 现在是感觉不太科学
- 新建文本文档(2).txt
- 新建文本文档(2)(2).txt
- 新建文本文档(2)(2)(2).txt
- 新建文本文档(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 编辑
- @echo off&setlocal enabledelayedexpansion&set "a=c:\2"&set "b=d:\3"
- 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
- pause
- :loop
- if not exist "!W!" (move "!M!" "!W!")else set /a n+=1&set "W=!b!\!f!(!n!)!e!"&goto :loop
- 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),绝对值增加则长度增加
- @echo off &setlocal enabledelayedexpansion
- set "path1=C:\2" &set "path2=D:\3" &pushd "!path1!"
- for /f "delims=" %%F in ('dir /b/a-d *.txt *.rar *.zip *.jpg *.mp4') do (
- if not exist "!path2!\%%~nxF" (move "%%F" "!path2!\") else (
- (call :get#nF "%%~nF" nFn n) & (call :check#2F nFn "%%~xF" !n! qF)
- move "%%F" "!path2!\!nFn!(!qF!)%%~xF"
- )
- )
- popd&endlocal&exit/b
- :get#nF //REM 获取源文件名序号锚点
- set "_nF=%~1" &if "!_nF:~-1!" neq ")" (set "%~2=%~1 " &set "%~3=2" &exit/b)
- set "_k=" &for /L %%k in (-2,-1,-5) do (
- set "c=!_nF:~%%k,1!"
- if "!c!"=="(" (set "%~2=!_nF:~0,%%k!" &set "%~3=!_k!" &exit/b) else (
- if "!c!" geq "0" if "!c!" leq "9" set "_k=!c!!_k!"
- )
- )
- exit/b
- :check#2F //REM 验证目标文件名不重复序号
- set "_qF=%~3"
- :[Loop]
- if exist "!path2!\!%~1!(!_qF!)%~2" (set/a "_qF+=1" &goto[Loop])
- 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楼的连接及所有子连接都试过 用的最简单文件名称测试的, 没有任何特殊符号的,
复制代码
- D:\A\新建文本文档.txt
- D:\A\1.txt
复制代码
- D:\B\新建文本文档.txt
- 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等。
- @echo off
- rem "http://www.bathome.net/redirect.php?goto=findpost&ptid=36991&pid=173326"
- cd /d "d:\A"
- for /r %%i in (*) do (
- set "strName=%%~nxi" & set "n="
- call :CP "%%i"
- )
- pause & exit
-
- :CP
- if not exist "d:\B\%strName%" move "%~1" "d:\B\%strName%" & goto :EOF
- if exist "d:\B\%strName%" set /a n+=1
- set "strName=%~n1(%n%)%~x1"
- 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')
如果源目录下有多个文件夹及子文件夹 里面都有这些相同文件名称- 新建文本文档 (2).txt
- 新建文本文档 (3).txt
复制代码
目标文件夹也有这些相同文件名称- 新建文本文档 (2).txt
- 新建文本文档 (3).txt
复制代码
就会发生这种情况- 新建文本文档 (2).txt
- 新建文本文档 (3).txt
- 新建文本文档 (4).txt
- 新建文本文档 (32).txt
- 新建文本文档 (232).txt
- 新建文本文档 (3232).txt
- 新建文本文档 (23232).txt
- 新建文本文档 (323232).txt
- 新建文本文档 (2323232).txt
- 新建文本文档 (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 有什么影响?
- http://bbs.bathome.net/redirect.php?goto=findpost&ptid=36991&pid=281494
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |