Board logo

标题: [文本处理] [已解决]批处理如何以资源管理器的文件名递增的排序规则列出指定扩展名/后缀的文件? [打印本页]

作者: kaze    时间: 2016-5-30 19:45     标题: [已解决]批处理如何以资源管理器的文件名递增的排序规则列出指定扩展名/后缀的文件?

本帖最后由 kaze 于 2016-6-7 17:47 编辑

现有文件
A-a3-wallet-ad65-1.txt
A-a3-wallet-ag2-1.txt
A-a3-wallet-ag17-1.txt
A-a3-wallet-ag18-1.txt
A-a3-wallet-ag117-1.txt
A-a3-wallet-butterfly-1.txt
A-a3-gx-wallet-flo-22-1.txt
A-a3-gx-wallet-flo-282-1.txt
A-a3-gx-wallet-flo-zebra-1.txt
要求生成文件列表排序

正确排序
A-a3-gx-wallet-flo-22
A-a3-gx-wallet-flo-282
A-a3-gx-wallet-flo-zebra
A-a3-wallet-ad65
A-a3-wallet-ag2
A-a3-wallet-ag17
A-a3-wallet-ag18
A-a3-wallet-ag117
A-a3-wallet-butterfly

不能直接使用dir或以下脚本,因为排序不合要求
for /r %%a in (*-1.txt) do echo %%~nxa>>2016.txt
弄了好久,我水平有限,解决不了,希望有大侠帮忙解决,谢谢啦!!

附一个创建脚本,方便大家测试:
cd.>A-a3-wallet-ad65-1.txt
cd.>A-a3-wallet-ag2-1.txt
cd.>A-a3-wallet-ag17-1.txt
cd.>A-a3-wallet-ag18-1.txt
cd.>A-a3-wallet-ag117-1.txt
cd.>A-a3-wallet-butterfly-1.txt
cd.>A-a3-gx-wallet-flo-22-1.txt
cd.>A-a3-gx-wallet-flo-282-1.txt
cd.>A-a3-gx-wallet-flo-zebra-1.txt
作者: ivor    时间: 2016-5-30 20:32

回复 1# kaze
  1. dir /b *.txt | sort
复制代码

作者: pcl_test    时间: 2016-5-30 20:36

本帖最后由 pcl_test 于 2017-4-21 23:42 编辑
  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 /s *-1.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. }
复制代码

作者: kaze    时间: 2016-5-31 15:20

回复 3# pcl_test
你好!很厉害啊,使用的通用方法。
本意是用来提取当前目录及子目录的*-1.txt文件名进行windows排序
我在14行加入语句去掉-1.txt后缀
for /f "delims=" %%i in (2016.txt) do (
        set "_word=%%i"
        call,set _word=%%_word:-1.txt=%%
        call,echo/%%_word%%
)>>2016t2.txt
为什么会有提示错误呢?而且无法搜索子目录的*-1.txt文件。

c:\Users\Admin\AppData\Local\Temp\$(1,9): error CS0116:
命名空间并不直接包含诸如字段或方法之类的成员
作者: gawk    时间: 2016-5-31 16:00

回复 5# kaze


>"%tmp%\$" more +16 "%~f0"
你增加了代码之后这个数字也要增加
作者: kaze    时间: 2016-5-31 16:32

回复 6# gawk


    谢谢,不过搜索子目录的文件  代码怎么改呢?
作者: kaze    时间: 2016-6-1 12:29

回复 3# pcl_test

你好大神,谢谢,不过 如果用 for /r %%a in (*-1.txt) do echo %%~nxa>>2016.txt 生成的文件名称列表,怎么使用该代码进行修改呢?
就是搜索包含当前目录和子目录的文件,以windows资源管理器的文件名递增的排序规则,  代码怎么改呢?
作者: pcl_test    时间: 2016-6-6 23:01

回复 7# kaze

3楼已改
作者: kaze    时间: 2016-6-7 17:48

回复 8# pcl_test


    谢谢大神的支持 .^_^




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