Board logo

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

作者: lateol    时间: 2013-7-9 10:13     标题: [已解决]批处理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
作者: xxpinqz    时间: 2013-7-9 10:32

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

作者: lateol    时间: 2013-7-9 10:44

回复 2# xxpinqz


    运行没反应?
作者: terse    时间: 2013-7-9 12:52

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

dkdh.lat 内容没变化吗
这里是否最好这样呢   dir /b /a-d w*.txt
作者: lateol    时间: 2013-7-9 15:47

回复 4# terse


    麻烦贴一段完整代码 谢谢!
作者: Python    时间: 2013-7-9 16:06

回复 5# lateol


    他的意思是,你自己在*.txt前加个w就行了。
作者: xxpinqz    时间: 2013-7-9 18:59

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

作者: lateol    时间: 2013-7-9 20:56

回复 7# xxpinqz


   有没有通用性一点的呢??
作者: terse    时间: 2013-7-9 21:57

要通用的难点在 文件名没规律 怎么个通用
至少要知道你文件名的组成规律 因为你顶楼给出范例 没看出还有其他变化
作者: lateol    时间: 2013-7-9 23:17

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

回复 9# terse


    通常  xxx-xxxxx-G.txt 是这样的  前面为[A-Z][1-99]-文件名-G.txt
作者: terse    时间: 2013-7-10 00:00

也不统用 仅仅针对你所描述的文件名情况
首字符为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
复制代码

作者: xxpinqz    时间: 2013-7-10 18:11

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

最好也说明下1-99有没可能重复。
作者: wskwfkbdn    时间: 2013-7-13 23:58

本帖最后由 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
作者: lateol    时间: 2013-7-14 14:41

回复 13# wskwfkbdn
感谢 您的详解帮助,请帖出你的代码 这样我比较容易理解谢谢。
作者: wskwfkbdn    时间: 2013-7-14 15:30

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

回复 14# lateol

修改补充:
@echo off
dir /b /a-d *.txt |sort -n -k 2 -t W
pause
作者: xxpinqz    时间: 2013-7-14 15:41

这个sort是第三方工具吧。
作者: pcl_test    时间: 2016-7-12 17:29

  1. /*&cls
  2. @echo off
  3. set "netpath=%systemroot%\Microsoft.NET\Framework"
  4. for /f "delims=" %%a in ('dir /ad /b "%netpath%\v?.*"') do (
  5.     if exist "%netpath%\%%a\csc.exe" (
  6.         set "cscpath=%netpath%\%%a\csc.exe"
  7.         goto :0
  8.     )
  9. )
  10. echo;未安装.Net Framework 2.0及其上版本组件或相关程序丢失&pause&exit
  11. :0
  12. "%cscpath%" /out:"%tmp%\$Expdir.exe" "%~f0"
  13. dir /a-d /b *.txt|%tmp%\$Expdir.exe
  14. pause&exit
  15. */
  16. using System;
  17. using System.IO;
  18. using System.Collections;
  19. using System.Runtime.InteropServices;
  20. class Expdir
  21. {
  22.     [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
  23.     private static extern int StrCmpLogicalW(string psz1, string psz2);
  24.     static void Main(string[] args)
  25.     {
  26.         ArrayList files = new ArrayList();
  27.         String f;
  28.         while((f=Console.ReadLine())!=null)
  29.         {
  30.             files.Add(Path.GetFileName(f));
  31.         }
  32.         string[] fs = (string[])files.ToArray(typeof(string));
  33.         Array.Sort(fs, StrCmpLogicalW);
  34.         foreach (string file in fs)
  35.         {
  36.             Console.WriteLine(file);
  37.         }
  38.     }
  39. }
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2