标题: [文件操作] 批处理 如何按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楼的帖子没看明白吗,我帮你写一下- @echo off
- setlocal enabledelayedexpansion
- for /l %%l in (1,1,10000) do (
- set num=000%%l
- if exist "a(%%l).jpg" (
- ren "a(%%l).jpg" "!num:~-4!.jpg"
- )
- )
- endlocal
- pause
复制代码
使用前先测试
作者: qixiaobin0715 时间: 2023-3-24 08:41
回复 6# arthrrwong
好像排序并不影响重命名,将批处理文件另存为ANSI编码:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1,2* delims=()" %%i in ('dir /b /a-d "*(*)*"') do (
- set n=000%%j
- ren "%%i(%%j)%%k" "!n:~-4!%%k"
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2023-3-24 08:54
牵涉到文件相关的,最好把扩展名一并写出来,便于处理。
作者: arthrrwong 时间: 2023-10-9 15:37
谢谢各位大神
作者: Five66 时间: 2023-10-9 19:32
可以试试用powershell
版本5.1以上- Add-Type -TypeDefinition @"
- using System.Runtime.InteropServices;
- namespace the{
- public static class sort{
- [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
- public static extern int StrCmpLogicalW(string psz1, string psz2);
- }}
- "@
-
- class exsort:System.Collections.IComparer{
- [int]Compare($a,$b){return [the.sort]::StrCmpLogicalW($a,$b)}
- }
-
- $a=gci -file -n
- [array]::sort($a,[exsort]::new())
- (0..($a.Length-1)).ForEach({rni -LiteralPath ($a[$_]) ([string]::format("{0:d4}",$_+1))})
复制代码
作者: Nsqs 时间: 2023-10-9 21:18
- @echo off
- 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"
- for /f "delims=" %%1 in ('%currentDir%')do echo %%1
- 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窗口里输入执行的
脚本文件执行的话试试下面的(加上了打印,方便测试,不过修改名字时还是不包含拓展名)
还有较高版本的系统不知道行不行- #@&cls&powershell -sta "$self='%~nx0';type -literalpath '%~f0'|out-string|iex"&pause&exit/b
-
- Add-Type -TypeDefinition @"
- using System.Runtime.InteropServices;
- namespace the{
- public static class sort{
- [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
- public static extern int StrCmpLogicalW(string psz1, string psz2);
- }}
- "@
-
- class exsort:System.Collections.IComparer{
- $st=0
- exsort($t){$this.st=$t}
- [int]Compare($a,$b){return $this.st::StrCmpLogicalW($a,$b)}
- }
-
- $a=gci -file -n -exclude ($MyInvocation.MyCommand.Name,$self)
- [array]::sort($a,[exsort]::new([the.sort]))
- (0..($a.Length-1)).ForEach({
- [console]::writeline("$($a[$_]) rename to "+[string]::format("{0:d4}",$_+1))
- #rni -LiteralPath ($a[$_]) ([string]::format("{0:d4}",$_+1))
- })
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |