标题: [文件操作] 【已结】关于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
试试这个代码如何?
-
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d "*.txt"') do (
- set str=//////////%%i
- set .!str:~-10! !random!=%%i
- )
- for /f "tokens=2 delims==" %%i in ('set .') do echo %%i
- 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
试试一下!
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /od /on /oe "*.ts"') do (
- echo %%i
- )
- 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
我的想法能够按照文件名长度排序
先输出短文件名,后输出长文件名的也行
可惜情况如下:- DIR /B/ON *.DISK?.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
复制代码
DIR /B/ON *.DISK??.TS则不能只显示
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk10.ts
Vantage.Point.Blu-ray.REMUX.TrueHD.SILUHD.disk11.ts
得到结果- DIR /B/ON *.DISK??.TS
- Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk1.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.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
复制代码
而是把所有的都显示出来了
晕,本想这样,我累加一下也好,但就是不行
[ 本帖最后由 seasands 于 2009-1-26 10:39 编辑 ]
作者: seasands 时间: 2009-1-26 11:23
自己解决了
实在不行,只能自己按照文件名长度排序了
不过效率就一般般了
-
- @echo off
- setlocal enabledelayedexpansion
- for %%a in ("*.ts") do (
- for /f "skip=1 delims=:" %%b in ('^(echo "%%~nxa"^&echo.^)^|findstr /o ".*"') do
- set /a length=%%b-5
- if !length! lss 10 (
- set .00!length!%%~nxa=%%~nxa
- ) else if !length! lss 100 (
- set .0!length!%%~nxa=%%~nxa
- ) else (
- set .!length!%%~nxa=%%~nxa
- )
- )
- 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
- @echo off
- set name1=Vantage.Point.Blu-ray.REMUX.1080P.H264.TrueHD.SILUHD.disk
- set ext=.ts
- for /l %%i in (1,1,1000) do if exist "%name1%%%i%ext%" echo %name1%%%i%ext%
- 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
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d "*.ts"') do (
- set str=%%i
- set/a n=0,m+=1
- set "_!m!=%%i"
- call:lp
- if !n! gtr !t! set/a t=n
- )
- for /l %%i in (1,1,%m%) do (
- set str=!_%%i!
- for /l %%j in (1,1,%t%) do set "str=/!str!"
- set /!str:~-%t%!=!_%%i!
- )
- for /f "tokens=2 delims==" %%i in ('set /') do echo %%i
- pause&exit
- :lp
- if defined str (
- set/a n+=1
- set str=%str:~1%
- goto lp
- )
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |