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

[文件操作] 【已结】关于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 编辑 ]

  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. )
复制代码

TOP

dir都没有么,看看tree什么命令的有不。。。

TOP

好像还是不能评分
再等等哦

TOP

防止刷分吧,呵呵
没事
回头我会给帮助的朋友加分
代码已经按照我自己的方法完成了
版主说的方法我下次在自己做下
应该效率高很多

TOP

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

请教各位,这个功能是防止什么的?

TOP

怎么加分?找了半天
似乎没权限

TOP

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

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


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

[ 本帖最后由 523066680 于 2009-1-26 15:19 编辑 ]

TOP

恩,13楼的方法是不错

TOP

LS的代码好!

不过拓展到更多例子就难说。。。

TOP

  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
复制代码

TOP

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

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

001 002 .....010 ....100....

TOP

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

  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
复制代码

TOP

我的想法能够按照文件名长度排序
先输出短文件名,后输出长文件名的也行
可惜情况如下:
  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 编辑 ]

TOP

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

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

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

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

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

那么N个数呢?

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

想想也知道可怕。。。

TOP

返回列表