标题: [文本处理] 批处理重命名后按名称排序会打乱,求助大佬帮助 [打印本页]
作者: 逍遥生 时间: 2023-2-21 20:02 标题: 批处理重命名后按名称排序会打乱,求助大佬帮助
- SETLOCAL ENABLEDELAYEDEXPANSION
- set /p num= 请输入开始数字:
- FOR /F "tokens=*" %%i in ('dir /A-D /B /OD /TC') do (
- IF NOT "%%i"=="%~n0%~x0" (
- set /A num+=1
- ren "%%i" "!num!%%~xi"
- )
- )
- ENDLOCAL
- exit
复制代码
比如原本顺序是1.jpg(a),2.jpg(b),3.jpg(c),4.jpg(d),5.jpg(e),想变成11.jpg(a),12.jpg(b),13.jpg(c),14.jpg(d),15.jpg(e)
但实际执行后会变成11.jpg(a),12.jpg(b),13.jpg(d),14.jpg(e),15.jpg(c)
部分文件未按照本来的顺序被打乱
作者: 77七 时间: 2023-2-21 21:09
你可以参考这个帖子
[分享]批处理按照数字顺序重命名图片改成连续的三位数
作者: buyiyang 时间: 2023-2-21 21:15
回复 1# 逍遥生 复制代码
这里/OD 是按时间排序,/ON 才是按名称排序。
作者: 逍遥生 时间: 2023-2-22 21:15
回复 2# 77七
看懂了一些,但是我想在我这个上面改动 好像没法解决
作者: 逍遥生 时间: 2023-2-22 21:19
回复 3# buyiyang
用on试了,好像顺序乱的更厉害了 好像是按照1,10,100...,11,111,111...,12,13...,2,20,21,这个排序后再重命名的
作者: 逍遥生 时间: 2023-2-22 21:20
求大佬指导。就是手动输入起始数字,然后安装win资源管理器里名称排列的顺序重命名
作者: 77七 时间: 2023-2-22 21:37
- @echo off
- set /p num=请输入开始数字:
- setlocal enabledelayedexpansion
- for /l %%i in (1,1,100) do (
- if exist %%i.jpg (
- ren "%%i.jpg" "!num!.jpg1"
- set /a num+=1
- )
- )
- ren "*.jpg1" "*.jpg"
- pause
复制代码
这样行吗
作者: 逍遥生 时间: 2023-2-22 22:04
回复 7# 77七
不行,三个问题,1.第二张开始顺序已经全乱了,2.有一半最后还是jpg1格式,3。只转换了前面一部分,后面的没动静,
小白只能简单看懂一些,这种复杂的问题,完全没头绪
作者: 77七 时间: 2023-2-22 22:19
回复 8# 逍遥生
把100改成10000试试
如果不行
请多举几个有代表性例子,或者贴出全部实际文件名
作者: 逍遥生 时间: 2023-2-22 22:28
回复 9# 77七
实际上手动合并漫画文件,文件是分散的,想把很多文件夹合并到一起,每个文件夹都是从1开始,手动合并的时候 要全部重命名 从1开始一直往后叠加,所以顺序不能打乱,具体多少个也是不固定的,我原本的可以实现大多数功能,就是有时候图片顺序会打乱,上面老哥说的/OD 是按时间排序,/ON的话好像是英文名称排序,不是数字名称排序
作者: Batcher 时间: 2023-2-22 22:40
回复 10# 逍遥生
请截图把能否反映问题的真实的文件名给大家看看,编出来的几个文件名没能准确解释问题所在。
如果需要上传文件,可以用阿里云盘或百度网盘。
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 逍遥生 时间: 2023-2-22 23:00
回复 11# Batcher
原始图片顺序是这样的
想要的结果是这样的
但实际结果经常是这样
作者: 77七 时间: 2023-2-22 23:04
本帖最后由 77七 于 2023-2-22 23:25 编辑
- @echo off
- set /p num=请输入开始数字:
- set max=0
- set min=99999999
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
- if %%~ni geq !max! (
- set max=%%~ni
- )
- if %%~ni leq !min! (
- set min=%%~ni
- )
- )
- for /l %%i in (!min!,1,!max!) do (
- if exist %%i.jpg (
- ren "%%i.jpg" "!num!.jpg1"
- set /a num+=1
- )
- )
- ren "*.jpg1" "*.jpg"
- pause
复制代码
作者: Batcher 时间: 2023-2-22 23:08
回复 12# 逍遥生
test_1.bat- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- REM 假设新的文件名从1001开始
- set "NewName=1001"
- REM 假设原文件个数不超过999个
- for /l %%i in (1,1,999) do (
- if exist "%%i.jpg" (
- ren "%%i.jpg" "!NewName!.jpg"
- )
- set /a NewName+=1
- )
复制代码
作者: 逍遥生 时间: 2023-2-22 23:18
回复 13# 77七
实测输出结果是这样
作者: 77七 时间: 2023-2-22 23:26
回复 15# 逍遥生
不好意思,犯了点低级错误,已修改代码,重新复制代码,再试试
作者: 逍遥生 时间: 2023-2-22 23:30
回复 14# Batcher
先感谢,实测重命名后顺序没有打乱, 小瑕疵就是设置的97开始累加,会自动循环到1000+以上才开始,应该是固定循环次数导致的,但是小白不知道怎么自动识别文件数 ,希望和上面的代码一样,只需输入开始数字,然后回车就可以自动完成了
我先自己研究下,各位大佬如果空闲的时候麻烦下帮忙完善
作者: 逍遥生 时间: 2023-2-22 23:33
回复 16# 77七
完美解决!感谢大佬,感谢各位帮主
作者: qixiaobin0715 时间: 2023-2-23 15:32
本帖最后由 qixiaobin0715 于 2023-2-23 15:34 编辑
根据你在顶楼及回复中的信息,总结一下:
1.在某个文件夹(比如abc)下有多个子文件夹;
2.每个子文件夹中有若干图片文件;
3.每个文件夹下图片文件是以1,2,3...来命名的;
4.不知道到底有多少个文件夹和文件;
5.你的需求是,将所有文件合并到文件夹abc下,按照1,2,3...的形式累加重新命名,重命名时各子文件夹中文件均按原有数字顺序排列。
如果是以上所说的情况的话,不需要每个文件夹都要进行一次处理,可以将所有子文件夹的文件一并处理,即将所有图片文件均移动到当前文件夹abc中并进行重命名操作。
运行下面代码需注意:
1.假设各子文件夹在文件夹abc中;
2.各子文件夹中只有图片文件,并且其中的文件名是严格按照1,2,3...的顺序命名,对于数字来说中间不得有空缺;
3.批处理文件要放在主文件夹abc中,不要放在子文件夹下;
4.批处理文件保存为ANSI编码- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /ad') do (
- pushd "%%i"
- for /f "delims=" %%j in ('dir /b /a-d *.jpg^|find /c ') do max=%%j
- for /l %%k in (1,1,!max!) do (
- set /a n+=1
- move "%%k.jpg" "..\!n!.jpg">nul 2>nul
- )
- popd
- rd "%%i"
- )
- pause
复制代码
未经测试,运行代码前请备份好源文件。
作者: WHY 时间: 2023-2-23 17:35
另一种办法:- @echo off
- setlocal enabledelayedexpansion
- if "%~1" NEQ "ARG" (
- set /p Num=Input:
- for /f "tokens=1*" %%i in ('"%~f0" ARG ^| sort') do (
- ren "%%j" "!Num!.tmp"
- set /a Num+=1
- )
- ren *.tmp *.jpg
- pause & exit
- ) else (
- for %%i in (*.jpg) do (
- set "Name=00000000000000000000%%~ni"
- echo;!Name:~-20! %%i
- )
- )
复制代码
作者: 逍遥生 时间: 2023-2-23 23:37
本帖最后由 逍遥生 于 2023-2-23 23:48 编辑
回复 20# WHY
请教个问题,这个代码单独执行没问题,但是我加个跳转为什么就执行没反应了呢
@echo off
color 0a
:loop
echo ============================================================
echo 批量重命名
echo ============================================================
echo 1.顺序重命名
echo ============================================================
echo ============================================================
set /p a=0 (退出)
if /i '%a%'=='1' goto pic1
echo 输入有误,请重新输入:&&goto loop
:pic1
setlocal enabledelayedexpansion
if "%~1" NEQ "ARG" (
set /p Num=Input:
for /f "tokens=1*" %%i in ('"%~f0" ARG ^| sort') do (
ren "%%j" "!Num!.tmp"
set /a Num+=1
)
ren *.tmp *.jpg
pause & exit
) else (
for %%i in (*.jpg) do (
set "Name=00000000000000000000%%~ni"
echo;!Name:~-20! %%i
)
)
作者: WHY 时间: 2023-2-24 01:07
本帖最后由 WHY 于 2023-2-24 22:32 编辑
回复 21# 逍遥生 - @echo off
- %1 %2
- color 0a
- :loop
- set "a="
- echo ============================================================
- echo 批量重命名
- echo ============================================================
- echo 1.顺序重命名
- echo ============================================================
- echo 0.退出
- echo ============================================================
- set /p a=Input the Number 0 or 1:
- if '%a%'=='1' (
- goto :pic1
- ) else if '%a%'=='0' (
- exit/b
- ) else (
- cls & echo 输入有误,请重新输入
- goto :loop
- )
-
- :pic1
- setlocal enabledelayedexpansion
- set /p Num=Input the first Number:
- for /f "tokens=1*" %%i in ('"%~f0" goto :LABAL ^| sort') do (
- ren "%%j" "!Num!.tmp"
- set /a Num+=1
- )
- ren *.tmp *.jpg
- pause & exit/b
-
- :LABAL
- setlocal enabledelayedexpansion
- for %%i in (*.jpg) do (
- set "Name=00000000000000000000%%~ni"
- echo;!Name:~-20! %%i
- )
- goto :EOF
复制代码
作者: 逍遥生 时间: 2023-2-24 20:59
回复 22# WHY
再次感谢,最后还有一个问题希望能解决,你的代码我修改一点点就会失效。。。
能不能不改动:pic1以上部分的代码情况下实现,因为是添加到自己批处理工具合集里面,如果修改了上面的代码,怕和我的其他选项里面的内容冲突
作者: WHY 时间: 2023-2-24 22:50
回复 23# 逍遥生
我不知道你是如何修改导致失效的。
脚本运行到第26行的 for 循环时,会启动一个 CMD 子进程,子进程运行的也是这个批处理,只不过会传递两个参数:%1=goto,%2=ABAL
所以子进程从第2行开始就执行跳转,执行的是第33行的标签内容。
脚本这样设计有它的优点(不用临时文件),当然也有缺点:不易读、不易改;批处理不能在命令行带参数运行(因为形参已被 %1 %2占用)
把你的"代码合集"放到23行以上位置,第2行 %1 %2 不能省略,应该没有问题。
作者: terse 时间: 2023-2-25 04:14
这样呢?- @echo off
- color 0a
- :loop
- set "a="
- echo ============================================================
- echo 批量重命名
- echo ============================================================
- echo 1.顺序重命名
- echo ============================================================
- echo 0.退出
- echo ============================================================
- set /p a=Input the Number 0 or 1:
- if '%a%'=='1' (
- goto :pic1
- ) else if '%a%'=='0' (
- exit/b
- ) else (
- cls & echo 输入有误,请重新输入
- goto :loop
- )
-
- :pic1
- setlocal enabledelayedexpansion
- set /p Num=Input the first Number:
-
- for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
- set name=::::::::::::::::::::%%~nxi
- set ":!name:~-20!=1"
- )
-
- for /f "delims=:=" %%i in ('set :^|sort') do (
- echo ren "%%i" "!Num!.jpg"
- set /a Num+=1
- )
- pause
复制代码
作者: 逍遥生 时间: 2023-2-25 10:54
本帖最后由 逍遥生 于 2023-2-25 11:12 编辑
回复 25# terse
感谢回复,实测直接运行后会打印出修改的结果,结果全部是理想的正确结果,但是不会修改名称
我删除32行的echo之后测试
测试图片1-126
输入100,前27张不会修改名称,28张之后会正确修改
输入10,前117张不会修改名称,最后10张修改正确
输入2,前125张不会修改,只修改成功最后一张
输入127会正确修改
输入1也会正确修改
没修改成功的都会提示(存在一个重名文件,或是找不到文件。)
试了好多次,小白 找不到原因。。。大佬们的代码都超出我理解范围,关键地方我都看不懂
作者: terse 时间: 2023-2-25 22:19
本帖最后由 terse 于 2023-2-25 22:27 编辑
回复 26# 逍遥生
存在一个重名文件的提示 就是新文件名已经存在 如果存在重复名你想怎么处理
后面FOR 要不就按WHY兄的方式处理- for /f "delims=:=" %%i in ('set :^|sort') do (
- ren "%%i" "!Num!.tmp"
- set /a Num+=1
- )
- ren *.tmp *.jpg
复制代码
作者: 逍遥生 时间: 2023-2-28 20:18
回复 27# terse
是的,想明白问题了,确实why和77的那种先改格式是最优解,就是他们的代码不能添加到我的合计里面对我来说用起来不太方便,你的代码适合添加到批处理合集里,就是遇到有名称重叠时候会卡壳
作者: hfxiang 时间: 2023-3-1 11:25
回复 1# 逍遥生
1.测试时请先备份文件
2.由于Windows下的sort无法完成dir/b输出结果的数值排序,暂时可借用第3方工具gawk(http://bcn.bathome.net/tool/4.1.3/gawk.exe)来完成;
3.为防止重名问题,利用临时文件夹.\tmp放置结果;- @echo off
- rem 保存为ANSI编码
- SETLOCAL ENABLEDELAYEDEXPANSION
- rd tmp/s/q>nul
- md tmp>nul
- set /p num= 请输入开始数字:
- FOR /F "tokens=*" %%i in ('dir /b^|gawk -F"." "{a[$1]=$0;b[NR]=$1}END{l=asort(b,c);for(i=1;i<=l;i++)print a[c[i]]}"') do (
- IF NOT "%%~fi"=="%~f0" (
- move "%%~fi" "%%~dpitmp\!num!%%~xi"
- set /A num+=1
- )
- )
- ENDLOCAL
复制代码
作者: newswan 时间: 2023-3-1 12:37
回复 29# hfxiang
gnu 工具 sort -n
作者: 逍遥生 时间: 2023-3-12 20:16
回复 29# hfxiang
感谢回复,直接运行没动静, 如果要借助第三方工具的话 我知道就有win下很方便的各种重命名工具,不过就是嫌太麻烦。随时换电脑还要都下载上,不如直接一个bat方便
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |