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

[文件操作] [讨论]dir /od 果真是按照时间排序的么?

本帖最后由 namejm 于 2011-5-18 19:18 编辑

在dir的帮助信息中,对参数 /OD 的解释是: 按日期/时间(从先到后)
果真如此?
我们来做个试验:
  1. @echo off
  2. for /l %%i in (1,1,300) do cd.>%%i.txt
  3. dir /a-d /b /od *.txt
  4. pause
复制代码
结果截图:

谁能看出这些文件到底是按什么顺序排列的?
别问我
我也不知道

看了一下各位的回帖
貌似各个系统之间有所差别
补充一下我的测试环境:
WindowsXP_Pro_SP3,简体中文版

或许这是dir的一个bug
可能到了Win7下被修复了
一如N年前在XP_SP2下用 reg querry 查询含中文字符的字符串会被“吃掉”部分字符,到了XP_SP3下已经被修复了一样
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

  1. for /l %%i in (1,1,300) do cd.>%%i.txt
复制代码
这个命令的运行只需要大约3秒钟,也就是说,平均每秒钟100个文件。
dir /od的时间判断可能没有这么精确(精确到0.01秒),所以就出现了如图情况(图上的文件名均小于100,而这些文件都是同一秒创建的)

TOP

楼上正解。

TOP

本帖最后由 zm900612 于 2011-5-17 19:21 编辑

复杂,占位思考

虽说是同一秒内创建,但是它的排序总应该遵循什么规律吧,要不然两次dir的结果将是不同的

TOP

而且,这个顺序似乎在创建时就注定了的
  1. @echo off
  2. for /l %%i in (1,1,300) do cd.>%%i.txt
  3. dir /a-d /b /od *.txt>tmp1
  4. dir /a-d /b /od *.txt>tmp2
  5. fc tmp1 tmp2
  6. pause
复制代码
  1. @echo off
  2. for /l %%i in (1,1,300) do cd.>%%i.txt
  3. dir /a-d /b /od *.txt>tmp1
  4. for /l %%i in (1,1,300) do cd.>%%i.txt
  5. dir /a-d /b /od *.txt>tmp2
  6. fc tmp1 tmp2
  7. pause
复制代码

TOP

本帖最后由 michael8111 于 2011-5-17 19:33 编辑

楼上:经过测试,两次dir的结果确实是不同的。我只截取一段以证明:
第一次:
  1. 1.txt
  2. 2.txt
  3. 6.txt
  4. 5.txt
  5. 4.txt
  6. 7.txt
  7. 3.txt
  8. 8.txt
  9. 12.txt
  10. 13.txt
  11. 10.txt
  12. 9.txt
  13. 11.txt
  14. 15.txt
  15. 16.txt
复制代码
第二次:
  1. 1.txt
  2. 3.txt
  3. 4.txt
  4. 5.txt
  5. 6.txt
  6. 2.txt
  7. 7.txt
  8. 11.txt
  9. 10.txt
  10. 12.txt
  11. 8.txt
  12. 9.txt
  13. 17.txt
  14. 14.txt
  15. 18.txt
复制代码
那么,每一次创建300个文件的代码都是一样的,而结果却不同。dir的排序究竟遵循什么规律?这个有待于发现。

TOP

6# michael8111

两次dir中的txt是同一批的吗?我用5楼的代码试验,同批次的没有区别,不同批的则存在区别

TOP

对,不同批的存在区别。
另外:
  1. @echo off
  2. for /l %%i in (1,1,300) do (
  3. ping -n 1 127.1>nul
  4. cd.>%%i.txt
  5. )
  6. dir /a-d /b /od *.txt
  7. pause
复制代码
这次执行后,dir的顺序完全变成正常顺序。
再另外:
6楼的结果是win7下的测试结果,300个文件的排序只有微小的差别,而不是像楼主的截图一样有巨大的差别。难道dir的排序与操作系统有关?或者与电脑的快慢有关?

TOP

9楼发的是什么?

TOP

本帖最后由 mxxcgzxxx 于 2011-5-17 19:45 编辑

你试下创建1000个文件的FOR,并每次显示一下%%1,会发现在数完前,并没有文件生成,所以应该是FOR创建文件的问题吧!
  1. for /l %%1 in (1,1,1000) do echo %%1&cd.>%%1.txt
复制代码
原理应该和FOR中的GOTO是一样的道理。循环结束后才执行循环中的有效任务
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

8楼的代码比较易于观察,观察后发现:
每一个ping的延时之后都生成一个文件,所以FOR /l是每循环一次就创建一个文件

TOP

10# mxxcgzxxx


文件其实已经创建了,只是explorer刷新不够快而已,这很容易证明的,把文件数改成1000000,然后在没数完的时候刷新一下看看就知道了

TOP

本帖最后由 mxxcgzxxx 于 2011-5-17 19:54 编辑
10# mxxcgzxxx


文件其实已经创建了,只是explorer刷新不够快而已,这很容易证明的,把文件数改成1000000,然后在没数完的时候刷新一下看看就知道了
zm900612 发表于 2011-5-17 19:43


哦,那是我对CMD的理解还不到位
试了一下10000次的,确实是早已创建文件,但有趣的是我的显示好多秒才显完10000,而10000个文还是在同一秒里创建的,而我刷新时也是出现3000、8000、10000几个层次出现文件,这就有趣了!是什么原因?
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

忽然发现fc Tmp1 Tmp2的时候,回显中的Tmp1是按照原文件名的大小写来显示,而Tmp2则被自动转为大写,看来这一特性很适合将长字符串的小写字母转大写呀

TOP

那就是说创建文件的速度太快,而系统最小只能识别到秒。必须给个延时让创建的时间有秒级上的区别才能正确排序!
这样理解对不!
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

返回列表