Board logo

标题: [文件操作] 【已结】关于DIR的排序问题(非常规排序) [打印本页]

作者: seasands    时间: 2009-1-25 14:57     标题: 【已结】关于DIR的排序问题(非常规排序)

当排序特俗情况下的文件名时
按照按名称(字母顺序)排序与资源管理器排序不同
比如有如下文件
www1.txt
www2.txt
www3.txt
www4.txt
www10.txt
www18.txt
www101.txt

资源管理器里面就是如上排序
dir *.TXT /ON 出来后时
www1.txt
www10.txt
www101.txt
www18.txt
www2.txt
www3.txt
www4.txt
这个排序不是我想要的
如何能做到跟资源管理器的一样呢?

还有别的参数控制么?
如果不能通过参数做到,还有别的方法么?
如果需要排序的话
麻烦各位赐教

[ 本帖最后由 seasands 于 2009-1-25 14:58 编辑 ]
作者: seasands    时间: 2009-1-25 14:58

第一帖就来提问,多多谅解
希望得到帮助
作者: ganjie    时间: 2009-1-25 15:04

试试这个代码如何?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /a-d "*.txt"') do (
  3. set str=//////////%%i
  4. set .!str:~-10! !random!=%%i
  5. )
  6. for /f "tokens=2 delims==" %%i in ('set .') do echo %%i
  7. pause
复制代码

作者: seasands    时间: 2009-1-25 15:05

这么快就有朋友答复
感谢,我试试
作者: seasands    时间: 2009-1-25 15:17

Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk10.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk11.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk1.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk2.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk3.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk4.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk5.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk6.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk7.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk8.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk9.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk111.ts

列举个实例出来,上面是排序后的结果

[ 本帖最后由 seasands 于 2009-1-26 13:06 编辑 ]
作者: seasands    时间: 2009-1-25 15:19

Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk1.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk2.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk3.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk4.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk5.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk6.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk7.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk8.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk9.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk10.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk11.ts
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk111.ts
希望得到的排序是这样
作者: ganjie    时间: 2009-1-25 15:54

试试一下!
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /od /on /oe "*.ts"') do (
  3. echo %%i
  4. )
  5. pause
复制代码

作者: seasands    时间: 2009-1-25 16:03

好像 还是不行
得到结果
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk1.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk10.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk11.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk110.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk111.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk2.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk3.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk4.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk5.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk6.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk7.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk8.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk9.ts
作者: defanive    时间: 2009-1-25 23:36

你是希望按数字大小排列吧。。。

虽然说这不是不可能,但是主要是批处理没有排列大小的功能。。。

那么我们想一下,a,b,c三个数,我们怎么排列呢?

第一次判断
—>得到b>a
第二次判断
—>得到a>c,排列结束:b>a>c
—>得到c>a,第三次判断—>得到b>c,排列结束:b>c>a

四个数的判断你可以枚举一下,估计在6~8次判断左右。。。

那么N个数呢?

而且,文件夹里面还有其他文件呢?

想想也知道可怕。。。
作者: seasands    时间: 2009-1-26 10:32

我的想法能够按照文件名长度排序
先输出短文件名,后输出长文件名的也行
可惜情况如下:
  1. DIR /B/ON *.DISK?.TS
  2. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk1.ts
  3. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk2.ts
  4. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk3.ts
  5. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk4.ts
  6. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk5.ts
  7. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk6.ts
  8. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk7.ts
  9. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk8.ts
  10. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk9.ts
复制代码
DIR /B/ON *.DISK??.TS则不能只显示
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk10.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk11.ts
得到结果
  1. DIR /B/ON *.DISK??.TS
  2. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk1.ts
  3. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk10.ts
  4. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk11.ts
  5. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk2.ts
  6. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk3.ts
  7. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk4.ts
  8. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk5.ts
  9. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk6.ts
  10. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk7.ts
  11. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk8.ts
  12. Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk9.ts
复制代码
而是把所有的都显示出来了
晕,本想这样,我累加一下也好,但就是不行

[ 本帖最后由 seasands 于 2009-1-26 10:39 编辑 ]
作者: seasands    时间: 2009-1-26 11:23

自己解决了
实在不行,只能自己按照文件名长度排序了
不过效率就一般般了

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in ("*.ts") do (
  4.   for /f "skip=1 delims=:" %%b in ('^(echo "%%~nxa"^&echo.^)^|findstr /o ".*"') do
  5. set /a length=%%b-5
  6.   if !length! lss 10 (
  7.     set .00!length!%%~nxa=%%~nxa
  8.   ) else if !length! lss 100 (
  9.     set .0!length!%%~nxa=%%~nxa
  10.   ) else (
  11.     set .!length!%%~nxa=%%~nxa
  12.   )
  13. )
  14. for /f "tokens=2 delims==" %%a in ('set .') do echo %%a
复制代码

作者: 523066680    时间: 2009-1-26 12:38

按5楼的例子,感觉学来的补零技术可以用,抓住特征部分
Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk

后面接的都是x.ts
x可能是1-3位数  适当地补零, 使它始终存在三个数字 dir出来的
应该就是按数字大小排列了。

001 002 .....010 ....100....
作者: wxcute    时间: 2009-1-26 12:56

  1. @echo off
  2. set name1=Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk
  3. set ext=.ts
  4. for /l %%i in (1,1,1000) do if exist "%name1%%%i%ext%" echo %name1%%%i%ext%
  5. pause
复制代码

作者: defanive    时间: 2009-1-26 14:27

LS的代码好!

不过拓展到更多例子就难说。。。
作者: seasands    时间: 2009-1-26 14:54

恩,13楼的方法是不错
作者: 523066680    时间: 2009-1-26 15:12

关于个数不定,那就先dir或者For文件总个数 然后决定补零的最多个数

      但是如果其他字符情况,嘿嘿 个人认为吃力不讨好 别的软件也未必能做到通用
还是编者自己根据情况将一个模板改写吧。


      另外是楼主如果觉得好的时候要记得加分。“我加人人, 人人加我”^_^

[ 本帖最后由 523066680 于 2009-1-26 15:19 编辑 ]
作者: seasands    时间: 2009-1-26 15:19

怎么加分?找了半天
似乎没权限
作者: 523066680    时间: 2009-1-26 15:21

那个 这个 这个嘛……  在帖子的右下角 有个评分
我想起来了 我刚进论坛的时候也不能加分的…… 忘了

请教各位,这个功能是防止什么的?
作者: seasands    时间: 2009-1-26 15:27

防止刷分吧,呵呵
没事
回头我会给帮助的朋友加分
代码已经按照我自己的方法完成了
版主说的方法我下次在自己做下
应该效率高很多
作者: seasands    时间: 2009-1-29 16:32

好像还是不能评分
再等等哦
作者: defanive    时间: 2009-1-29 18:08

dir都没有么,看看tree什么命令的有不。。。
作者: terse    时间: 2009-1-29 21:23

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /a-d "*.ts"') do (
  3.    set str=%%i
  4.    set/a n=0,m+=1
  5.    set "_!m!=%%i"
  6.    call:lp
  7.    if !n! gtr !t! set/a t=n
  8. )
  9. for /l %%i in (1,1,%m%) do (
  10.     set str=!_%%i!
  11.     for /l %%j in (1,1,%t%) do set "str=/!str!"
  12.     set /!str:~-%t%!=!_%%i!
  13. )
  14. for /f "tokens=2 delims==" %%i in ('set /') do echo %%i
  15. pause&exit
  16. :lp
  17. if defined str (
  18.    set/a n+=1
  19.    set str=%str:~1%
  20.    goto lp
  21. )
复制代码





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