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

[文本处理] 批处理重命名后按名称排序会打乱,求助大佬帮助

  1. SETLOCAL ENABLEDELAYEDEXPANSION
  2. set /p num= 请输入开始数字:
  3. FOR /F "tokens=*" %%i in ('dir /A-D /B /OD /TC') do (
  4.     IF NOT "%%i"=="%~n0%~x0" (
  5.         set /A num+=1
  6.         ren "%%i" "!num!%%~xi"
  7.     )
  8. )
  9. ENDLOCAL
  10. 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)
部分文件未按照本来的顺序被打乱

回复 29# hfxiang


    感谢回复,直接运行没动静, 如果要借助第三方工具的话  我知道就有win下很方便的各种重命名工具,不过就是嫌太麻烦。随时换电脑还要都下载上,不如直接一个bat方便

TOP

回复 29# hfxiang


  gnu 工具 sort -n

TOP

回复 1# 逍遥生

1.测试时请先备份文件
2.由于Windows下的sort无法完成dir/b输出结果的数值排序,暂时可借用第3方工具gawk(http://bcn.bathome.net/tool/4.1.3/gawk.exe)来完成;
3.为防止重名问题,利用临时文件夹.\tmp放置结果;
  1. @echo off
  2. rem 保存为ANSI编码
  3. SETLOCAL ENABLEDELAYEDEXPANSION
  4. rd tmp/s/q>nul
  5. md tmp>nul
  6. set /p num= 请输入开始数字:
  7. 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 (
  8.     IF NOT "%%~fi"=="%~f0" (
  9.         move "%%~fi" "%%~dpitmp\!num!%%~xi"
  10. set /A num+=1
  11.     )
  12. )
  13. ENDLOCAL
复制代码

TOP

回复 27# terse

是的,想明白问题了,确实why和77的那种先改格式是最优解,就是他们的代码不能添加到我的合计里面对我来说用起来不太方便,你的代码适合添加到批处理合集里,就是遇到有名称重叠时候会卡壳

TOP

本帖最后由 terse 于 2023-2-25 22:27 编辑

回复 26# 逍遥生
存在一个重名文件的提示 就是新文件名已经存在 如果存在重复名你想怎么处理
后面FOR 要不就按WHY兄的方式处理
  1. for /f "delims=:=" %%i in ('set :^|sort') do (
  2.      ren "%%i" "!Num!.tmp"
  3.      set /a Num+=1
  4. )
  5. ren *.tmp *.jpg
复制代码

TOP

本帖最后由 逍遥生 于 2023-2-25 11:12 编辑

回复 25# terse


    感谢回复,实测直接运行后会打印出修改的结果,结果全部是理想的正确结果,但是不会修改名称
我删除32行的echo之后测试
测试图片1-126
输入100,前27张不会修改名称,28张之后会正确修改
输入10,前117张不会修改名称,最后10张修改正确
输入2,前125张不会修改,只修改成功最后一张
输入127会正确修改
输入1也会正确修改
没修改成功的都会提示(存在一个重名文件,或是找不到文件。)

试了好多次,小白 找不到原因。。。大佬们的代码都超出我理解范围,关键地方我都看不懂

TOP

这样呢?
  1. @echo off
  2. color 0a
  3. :loop
  4. set "a="
  5. echo ============================================================
  6. echo                           批量重命名
  7. echo ============================================================
  8. echo        1.顺序重命名
  9. echo ============================================================
  10. echo        0.退出
  11. echo ============================================================
  12. set /p a=Input the Number 0 or 1:
  13. if '%a%'=='1' (
  14.     goto :pic1
  15. ) else if '%a%'=='0' (
  16.     exit/b
  17. ) else (
  18.     cls & echo 输入有误,请重新输入
  19.     goto :loop
  20. )
  21. :pic1
  22. setlocal enabledelayedexpansion
  23. set /p Num=Input the first Number:
  24. for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  25.      set name=::::::::::::::::::::%%~nxi
  26.      set ":!name:~-20!=1"
  27. )
  28. for /f "delims=:=" %%i in ('set :^|sort') do (
  29.      echo ren "%%i" "!Num!.jpg"
  30.      set /a Num+=1
  31. )
  32. pause
复制代码

TOP

回复 23# 逍遥生


    我不知道你是如何修改导致失效的。
脚本运行到第26行的 for 循环时,会启动一个 CMD 子进程,子进程运行的也是这个批处理,只不过会传递两个参数:%1=goto,%2=ABAL
所以子进程从第2行开始就执行跳转,执行的是第33行的标签内容。

脚本这样设计有它的优点(不用临时文件),当然也有缺点:不易读、不易改;批处理不能在命令行带参数运行(因为形参已被 %1 %2占用)

把你的"代码合集"放到23行以上位置,第2行 %1 %2 不能省略,应该没有问题。

TOP

回复 22# WHY


    再次感谢,最后还有一个问题希望能解决,你的代码我修改一点点就会失效。。。

能不能不改动:pic1以上部分的代码情况下实现,因为是添加到自己批处理工具合集里面,如果修改了上面的代码,怕和我的其他选项里面的内容冲突

TOP

本帖最后由 WHY 于 2023-2-24 22:32 编辑

回复 21# 逍遥生
  1. @echo off
  2. %1 %2
  3. color 0a
  4. :loop
  5. set "a="
  6. echo ============================================================
  7. echo                           批量重命名
  8. echo ============================================================
  9. echo        1.顺序重命名
  10. echo ============================================================
  11. echo        0.退出
  12. echo ============================================================
  13. set /p a=Input the Number 0 or 1:
  14. if '%a%'=='1' (
  15.     goto :pic1
  16. ) else if '%a%'=='0' (
  17.     exit/b
  18. ) else (
  19.     cls & echo 输入有误,请重新输入
  20.     goto :loop
  21. )
  22. :pic1
  23. setlocal enabledelayedexpansion
  24. set /p Num=Input the first Number:
  25. for /f "tokens=1*" %%i in ('"%~f0" goto :LABAL ^| sort') do (
  26.     ren "%%j" "!Num!.tmp"
  27.     set /a Num+=1
  28. )
  29. ren *.tmp *.jpg
  30. pause & exit/b
  31. :LABAL
  32. setlocal enabledelayedexpansion
  33. for %%i in (*.jpg) do (
  34.     set "Name=00000000000000000000%%~ni"
  35.     echo;!Name:~-20! %%i
  36. )
  37. goto :EOF
复制代码
1

评分人数

TOP

本帖最后由 逍遥生 于 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
    )
)

TOP

另一种办法:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if "%~1" NEQ "ARG" (
  4.     set /p Num=Input:
  5.     for /f "tokens=1*" %%i in ('"%~f0" ARG ^| sort') do (
  6.         ren "%%j" "!Num!.tmp"
  7.         set /a Num+=1
  8.     )
  9.     ren *.tmp *.jpg
  10.     pause & exit
  11. ) else (
  12.     for %%i in (*.jpg) do (
  13.         set "Name=00000000000000000000%%~ni"
  14.         echo;!Name:~-20! %%i
  15.     )
  16. )
复制代码
1

评分人数

    • 逍遥生: 感谢,同样可行,而且效率更高!技术 + 1

TOP

本帖最后由 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编码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad') do (
  4.     pushd "%%i"
  5.     for /f "delims=" %%j in ('dir /b /a-d *.jpg^|find /c ') do max=%%j
  6.     for /l %%k in (1,1,!max!) do (
  7.         set /a n+=1
  8.         move "%%k.jpg" "..\!n!.jpg">nul 2>nul
  9.     )
  10.     popd
  11.     rd "%%i"
  12. )
  13. pause
复制代码
未经测试,运行代码前请备份好源文件。
1

评分人数

    • 逍遥生: 感谢,先收藏,下次有合适的再试,不过大部 ...技术 + 1

TOP

回复 16# 77七


    完美解决!感谢大佬,感谢各位帮主

TOP

返回列表