Board logo

标题: [文件操作] 批处理如何把文件夹目录下的数字文件名按大小排序? [打印本页]

作者: roceys    时间: 2020-4-10 01:33     标题: 批处理如何把文件夹目录下的数字文件名按大小排序?

BAT批处理部分:
  1. for %%i in ("%dir%\*%ext%") do (
  2. set /a n+=1
  3. copy "%%i" "%bakDir%%prefix%!n!%ext%"
  4. echo "%%i ----> %bakDir%%prefix%!n!%ext%"
  5. )
复制代码
在这个for循环里的文件名为1.jpg、2.jpg、3.jpg以此类推有几百个,全是数字的。
读取后默认的排序是按字母来的11.jpg会排在2.jpg前面(windows资源管理器中是按数字大小),如何能按数字大小排序,再进一步操作呢。
dir为目录路径,ext为文件扩展名,都是可自定义输入参数。

以上谢谢大家~
作者: wujunkai    时间: 2020-4-10 07:13

回复 1# roceys


    你确定有循环吗?
作者: roceys    时间: 2020-4-10 11:56

回复 2# wujunkai
我是循环读取指定目录下的文件再复制改名备份
作者: wujunkai    时间: 2020-4-10 12:48

回复 3# roceys


    按照你的代码来,%%i只会被赋值一次
作者: FOR    时间: 2020-4-10 14:25

先重命名原文件,把位数补齐,比如 001.jpg
又或者把文件名都写入一个临时文件,再把临时文件里的文件名位数补齐,再操作
又或者先把所有文件名都设为变量再排序
作者: roceys    时间: 2020-4-11 00:17

回复 4# wujunkai
代码没变化,我的整个目录文件都输出了,就是排序不对,没写排序算法进去,不太懂bat的排序。
作者: roceys    时间: 2020-4-11 00:19

回复 5# FOR
补齐的方法对文件多的排序还是有问题,要专门写个转换数字的排序,bat上有点麻烦。
作者: went    时间: 2020-4-11 10:30

回复 7# roceys

还是用补齐位数的方法
  1. @echo off
  2. set "dir=C:\Users\lenovo\Desktop\0"
  3. set "ext=.jpeg"
  4. set "str=0000000000"
  5. (
  6. for /r "%dir%" %%i in ("*%ext%") do (
  7. set "n=%str%%%~ni"
  8. call echo %%n:~-10%%?%%i
  9. )
  10. ) >"sort.txt"
  11. for /f "tokens=2 delims=?" %%i in ('sort "sort.txt"') do echo %%i
  12. del /f /q sort.txt
  13. pause&exit
复制代码
如果不生成临时文件
  1. @echo off
  2. REM dir
  3. set "dir=C:\Users\lenovo\Desktop\0"
  4. set "ext=.jpeg"
  5. REM ext
  6. set "str=0000000000"
  7. set "code=(for /r "%dir%" %%i in ("*%ext%"^) do @(set "n=%str%%%~ni" ^& call echo %%n:~-10%%?%%i ^)^) ^| sort"
  8. for /f "tokens=2 delims=?" %%a in ('%code%') do (
  9. echo %%a
  10. )
  11. pause&exit
复制代码

作者: roceys    时间: 2020-4-11 14:44

回复 8# went
非常感谢,用第二种不生成临时文件的方法实现了,第一种测试了下如果目录下含有子目录的话,排序时会把子目录文件也加进来。
另外为啥批处理语法里,把这个for循环放在if块里就不会生效,把它单独放代码段里,再到if块里跳转过去才有效?
bat刚入门,还望多指教。
作者: went    时间: 2020-4-11 20:49

回复 9# roceys

语句块里面使用变量要开延时




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