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

[文本处理] [已解决]批处理dir+sort如何实现按资源管理器的文件名递增的排序列出文件?

本帖最后由 pcl_test 于 2016-7-12 17:20 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /a-d *.*') do (
  3. echo %%i>>"dkdh.lat"
  4. )
  5.                 >$.t sort <"dkdh.lat" 2>nul
  6.                   move $.t "123.txt" 2>nul
  7. pause
复制代码
获取当前目录下的 txt
为啥是这个样的?
W1-D12.txt
W10-R1.txt
W11-R0.5.txt
W12-D10.txt
W2-D10.txt
W3-D6.txt
W4-D12.txt
W5-D3.txt
W6-R3.txt
W7-D6R0.5.txt
W8-D4R0.5.txt
W9-R2.txt

想要给他排成,看了这个命令的说明,好像没有对这一个的详细解说啊。还有其他的用法吗?
W1-D12.txt
W2-D10.txt
W3-D6.txt
W4-D12.txt
W5-D3.txt
W6-R3.txt
W7-D6R0.5.txt
W8-D4R0.5.txt
W9-R2.txt
W10-R1.txt
W11-R0.5.txt
W12-D10.txt
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off&setlocal enabledelayedexpansion
  2. %1 (for /f "tokens=1*" %%a in ('%0 :^|sort') do echo %%b)>>"dkdh.lat"&exit /b
  3. for /f "tokens=1* delims=W-" %%i in ('dir /b /a-d *.txt') do (
  4.     set n=00000%%i
  5.     echo !n:~-5! W%%i-%%j
  6. )
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 2# xxpinqz


    运行没反应?

TOP

本帖最后由 terse 于 2013-7-9 12:55 编辑

dkdh.lat 内容没变化吗
这里是否最好这样呢   dir /b /a-d w*.txt

TOP

回复 4# terse


    麻烦贴一段完整代码 谢谢!

TOP

回复 5# lateol


    他的意思是,你自己在*.txt前加个w就行了。

TOP

回复 4# terse
多谢提醒。。
回复 3# lateol
你是不是插到其他代码内,改成下面的看看,只针对W开头文本
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims=W-" %%i in ('dir /b /a-d W*.txt') do (
  3.     set n=00000%%i
  4.     echo !n:~-5! W%%i-%%j
  5. ))>tmp
  6. (for /f "tokens=1*" %%a in ('sort tmp') do echo %%b)>>"dkdh.lat"
  7. del tmp
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 7# xxpinqz


   有没有通用性一点的呢??

TOP

要通用的难点在 文件名没规律 怎么个通用
至少要知道你文件名的组成规律 因为你顶楼给出范例 没看出还有其他变化

TOP

本帖最后由 lateol 于 2013-7-9 23:19 编辑

回复 9# terse


    通常  xxx-xxxxx-G.txt 是这样的  前面为[A-Z][1-99]-文件名-G.txt

TOP

也不统用 仅仅针对你所描述的文件名情况
首字符为1个非数字 后面两位数字(因为你说1-99)  这样的组合
代码根据首字符和紧跟后面一位或两位数字进行排序
文件不是很多可以试下
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=-" %%i in ('dir /b /a-d *-*-G.txt') do (
  3.     set str=%%i
  4.     if !str:~1! lss 10 set "str=!str:~,1!0!str:~1!"
  5.     set "$!str!=%%i-%%j"
  6.     set "var=!var! !str!"
  7. )
  8. for /f %%i in ('"(for %%j in (!var!) do @echo %%j)|sort"') do echo !$%%i!
  9. pause
复制代码
1

评分人数

TOP

回复  terse
    通常  xxx-xxxxx-G.txt 是这样的  前面为[A-Z][1-99]-文件名-G.txt

最好也说明下1-99有没可能重复。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 wskwfkbdn 于 2013-7-14 00:03 编辑

sort -n -k 2 -t W 1.txt
1: sort的-n选项
你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。
我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!
2:sort提供了-t选项,后面可以设定间隔符,指定了间隔符之后,就可以用-k来指定列数了

结果相当满意:
W1-D12.txt
W2-D10.txt
W3-D6.txt
W4-D12.txt
W5-D3.txt
W6-R3.txt
W7-D6R0.5.txt
W8-D4R0.5.txt
W9-R2.txt
W10-R1.txt
W11-R0.5.txt
W12-D10.txt

TOP

回复 13# wskwfkbdn
感谢 您的详解帮助,请帖出你的代码 这样我比较容易理解谢谢。

TOP

本帖最后由 wskwfkbdn 于 2013-7-14 17:41 编辑

回复 14# lateol

修改补充:
@echo off
dir /b /a-d *.txt |sort -n -k 2 -t W
pause

TOP

返回列表