Board logo

标题: [文件操作] 批处理 如何按windows资源管理器里文件的顺序读取文件夹内的文件名 [打印本页]

作者: arthrrwong    时间: 2023-3-23 13:08     标题: 批处理 如何按windows资源管理器里文件的顺序读取文件夹内的文件名

如题,想给某个文件夹内的文件重新命名,这些文件本身是有顺序的,在资源管理器内都调整好的,但遇到a(1)、a(2)、a(3)......a(11)、a(12)......a(20)、a(21)......这样的文件名时,用dir 读取的顺序却是:
a(1)、a(10)、a(11)......a(2)、a(20)、a(21)......
求问:如何能按照资源管理器内的顺序即a(1)、a(2)、a(3)......a(11)、a(12)......a(20)、a(21)......来读取文件呢。我用的是For+dir 命令。
盼大神解答
作者: Batcher    时间: 2023-3-23 13:21

回复 1# arthrrwong


请发一个资源管理器里面的完整截图,看看是如何排序的。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: buyiyang    时间: 2023-3-23 14:37

文件名的数字部分在windows资源管理器里是按数值大小排序的,而dir是ASCII码排序的。
作者: newswan    时间: 2023-3-23 14:46

dir 不行,linux sort
https://www.runoob.com/linux/linux-comm-sort.html
作者: 77七    时间: 2023-3-23 15:04

参考这个帖子  [分享]批处理按照数字顺序重命名图片改成连续的三位数
作者: arthrrwong    时间: 2023-3-23 17:10

回复 4# newswan


    谢谢,我是小白,不太懂。我就是需要在BAT文件中运行一段代码,将BAT文件所在目录的文件重新按资源管理器中的排序重新编号,什么Linux sort ,我不会用啊
需求:
需要将a(1)、a(2)、a(3).......a(10)、a(11)........a(20)、a(21)......a(30)、a(31).......等连续的文件按顺序编号成0001、0002、0003.......
也就是说,把a(1)改名为0001,a(2)改成0002,以此类推,但现在用dir 后,却把a(10)改成了0002
作者: 77七    时间: 2023-3-23 22:29

5楼的帖子没看明白吗,我帮你写一下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%l in (1,1,10000) do (
  4. set num=000%%l
  5. if exist "a(%%l).jpg" (
  6. ren "a(%%l).jpg" "!num:~-4!.jpg"
  7. )
  8. )
  9. endlocal
  10. pause
复制代码


使用前先测试
作者: qixiaobin0715    时间: 2023-3-24 08:41

回复 6# arthrrwong
好像排序并不影响重命名,将批处理文件另存为ANSI编码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1,2* delims=()" %%i in ('dir /b /a-d "*(*)*"') do (
  4.     set n=000%%j
  5.     ren "%%i(%%j)%%k" "!n:~-4!%%k"
  6. )
  7. pause
复制代码

作者: qixiaobin0715    时间: 2023-3-24 08:54

牵涉到文件相关的,最好把扩展名一并写出来,便于处理。
作者: arthrrwong    时间: 2023-10-9 15:37

谢谢各位大神
作者: Five66    时间: 2023-10-9 19:32

可以试试用powershell
版本5.1以上
  1. Add-Type -TypeDefinition @"
  2. using System.Runtime.InteropServices;
  3. namespace the{
  4. public static class sort{
  5.     [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
  6.     public static extern int StrCmpLogicalW(string psz1, string psz2);
  7. }}
  8. "@
  9. class exsort:System.Collections.IComparer{
  10. [int]Compare($a,$b){return [the.sort]::StrCmpLogicalW($a,$b)}
  11. }
  12. $a=gci -file -n
  13. [array]::sort($a,[exsort]::new())
  14. (0..($a.Length-1)).ForEach({rni -LiteralPath ($a[$_]) ([string]::format("{0:d4}",$_+1))})
复制代码

作者: Nsqs    时间: 2023-10-9 21:18

  1. @echo off
  2. Set currentDir=powershell -noprofile -executionpolicy bypass "(dir -Exclude %~nx0|?{[int]$_.Attributes -ne 16}|sort{$name=$_.Name -replace '.*\((\d+)\)','$1';if($name -match '^\d+$'){[int]$name}}).Name"
  3. for /f "delims=" %%1 in ('%currentDir%')do echo %%1
  4. pause
复制代码

作者: Nsqs    时间: 2023-10-9 21:33

可以试试用powershell
版本5.1以上
Five66 发表于 2023-10-9 19:32



    你代码还需要调整一下,在我电脑5.1测试报错
作者: Five66    时间: 2023-10-10 06:13

回复 13# Nsqs


啊,因为那代码是直接在powershell窗口里输入执行的
脚本文件执行的话试试下面的(加上了打印,方便测试,不过修改名字时还是不包含拓展名)
还有较高版本的系统不知道行不行
  1. #@&cls&powershell -sta "$self='%~nx0';type -literalpath '%~f0'|out-string|iex"&pause&exit/b
  2. Add-Type -TypeDefinition @"
  3. using System.Runtime.InteropServices;
  4. namespace the{
  5. public static class sort{
  6.     [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
  7.     public static extern int StrCmpLogicalW(string psz1, string psz2);
  8. }}
  9. "@
  10. class exsort:System.Collections.IComparer{
  11. $st=0
  12. exsort($t){$this.st=$t}
  13. [int]Compare($a,$b){return $this.st::StrCmpLogicalW($a,$b)}
  14. }
  15. $a=gci -file -n -exclude ($MyInvocation.MyCommand.Name,$self)
  16. [array]::sort($a,[exsort]::new([the.sort]))
  17. (0..($a.Length-1)).ForEach({
  18. [console]::writeline("$($a[$_])        rename to        "+[string]::format("{0:d4}",$_+1))
  19. #rni -LiteralPath ($a[$_]) ([string]::format("{0:d4}",$_+1))
  20. })
复制代码





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