[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 编辑 ]

第一帖就来提问,多多谅解
希望得到帮助

TOP

试试这个代码如何?
  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
复制代码

TOP

这么快就有朋友答复
感谢,我试试

TOP

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 编辑 ]

TOP

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
希望得到的排序是这样

TOP

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

TOP

好像 还是不行
得到结果
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

TOP

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

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

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

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

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

那么N个数呢?

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

想想也知道可怕。。。

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

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

  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

按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. 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

LS的代码好!

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

TOP

恩,13楼的方法是不错

TOP

返回列表