找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32565|回复: 14

[文件操作] 【已解决】BAT怎样实现多个文件夹下有多种格式的图片重命名?

[复制链接]
发表于 2013-8-20 09:40:04 | 显示全部楼层 |阅读模式
路径下的多个文件夹下有多种格式(.tig  .jpg .pdf)的图片重命名
本身的文件名很乱,文件名的位数也不一致(如下图)
按图片现有顺序批量命名成1开头的5位数的名字:10001   10002
就怕出现下面这种的现象,顺序都是乱的
0.jpg
000.jpg
001.jpg
0010.jpg
00100.jpg
00101.jpg
00102.jpg
00103.jpg
00104.jpg
00105.jpg
00106.jpg
00107.jpg
00108.jpg
00109.jpg
0011.jpg
00110.jpg
00111.jpg
00112.jpg
00113.jpg
00114.jpg
00115.jpg
00116.jpg
00117.jpg
00118.jpg
00119.jpg
0012.jpg
00120.jpg
00121.jpg
00122.jpg
00123.jpg
00124.jpg
谢谢

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-8-20 10:22:24 | 显示全部楼层
本帖最后由 ADSL0125 于 2013-8-20 10:27 编辑

"图片现有顺序"
是指文件在资源管理器中按文件名升序吗?

例如
这种是字符排序
000.jpg
0101.jpg
099.jpg
100.jpg          <--1比0大,所以在最后
=====================================

资源管理器中是编号(数字)排序
000.jpg
099.jpg
100.jpg        
0101.jpg       <-- 0101认为是101,比100大,所以在最后   
=====================================
你要哪一种?
 楼主| 发表于 2013-8-20 12:41:22 | 显示全部楼层
本帖最后由 001011 于 2013-8-20 12:42 编辑

后面一种  
资源管理器中是编号(数字)排序
000.jpg
099.jpg
100.jpg        
0101.jpg       <-- 0101认为是101,比100大,所以在最后
 楼主| 发表于 2013-8-20 12:45:56 | 显示全部楼层
回复 2# ADSL0125

我需要这种,感谢!
    资源管理器中是编号(数字)排序
000.jpg
099.jpg
100.jpg        
0101.jpg       <-- 0101认为是101,比100大,所以在最后
发表于 2013-8-20 14:05:18 | 显示全部楼层
本帖最后由 ADSL0125 于 2013-8-20 15:49 编辑

回复 4# 001011


更正一下,那个排序名称应该叫 字符逻辑排序,
有专用的API函数,StrCmpLogicalW,用于比较两个字符串

BAT做模拟的话,可能会的与资源管理器排序不同(因为你不知道微软是怎么排的)

估计写程序调用API来对文件排序再改名比较容易实现
发表于 2013-8-20 17:35:57 | 显示全部楼层
纯数字文件名 也许BAT可试下 加其他结合难度增加不少
 楼主| 发表于 2013-8-20 19:03:51 | 显示全部楼层
回复 5# ADSL0125
那么复制啊  能否帮忙写一下代码啊
 楼主| 发表于 2013-8-20 22:21:36 | 显示全部楼层
可不可以先补位再命名呢  比如
000.jpg
099.jpg
100.jpg        
0101.jpg   
补位成
0000.jpg
0099.jpg
0100.jpg        
0101.jpg
发表于 2013-8-20 23:38:56 | 显示全部楼层
本帖最后由 ADSL0125 于 2013-8-21 00:56 编辑

回复 1# 001011

VBA调用API来排序,需要电脑上装有Excel 2003或以上

分选择文件夹和重命名两步,重命名前可以先看到准备改为的名字
  1. Option Explicit

  2. Declare Function StrCmpLogicalW Lib "shlwapi" (ByVal S1 As String, ByVal S2 As String) As Integer

  3. '2.重命名
  4. Public Sub Rename()

  5.     '获取行数
  6.     Dim L As Long
  7.         L = MainSheet.Range("D1").End(xlDown).Row - 2
  8.    
  9.     If L < 0 Or Len(MainSheet.Range("D2").Value) = 0 Then Exit Sub '没有数据退出
  10.    
  11.     '重命名
  12.     Dim F As Long, C As Long
  13.         On Error GoTo ErrRename
  14.         Call MainSheet.Range("E2:E50000").Clear
  15.         For F = 0 To L
  16.             If Len(MainSheet.Range("D2").Offset(F).Value) Then
  17.                 C = F
  18.                 MainSheet.Range("E2").Offset(F).Value = "OK"
  19.                 Name MainSheet.Range("B2").Offset(F).Value As MainSheet.Range("D2").Offset(F).Value
  20.             End If
  21.         Next
  22.         GoTo EXT




  23. ErrRename:
  24.     MainSheet.Range("E2").Offset(C).Value = "错误:" & Err.Description

  25.     Resume Next
  26. EXT:
  27. End Sub

  28. '1.选择文件夹
  29. Public Sub Start()
  30.     '获取选择路径
  31.     Dim OFD As FileDialog
  32.         Set OFD = Excel.Application.FileDialog(msoFileDialogFolderPicker)
  33.         
  34.         Call OFD.Show
  35.         If OFD.SelectedItems.Count = 0 Then Exit Sub
  36.         
  37.         Dim Path As String
  38.         Path = OFD.SelectedItems(1) & ""
  39.    
  40.     '获取文件,并排序
  41.     Dim Files() As String
  42.    
  43.         On Error GoTo ErrGetDirFiles
  44.         Files = GetDirFiles(Path)
  45.         On Error GoTo 0
  46.         
  47.         Files = FilesOrderByLogical(Files)
  48.    
  49.     '输出
  50.     Dim F As Long, L As Long
  51.         Call MainSheet.Range("A2:E50000").Clear
  52.         
  53.         L = UBound(Files)
  54.         For F = 0 To L
  55.             MainSheet.Range("A2").Offset(F).Value = F + 1
  56.             MainSheet.Range("B2").Offset(F).Value = Path & Files(F)
  57.             MainSheet.Range("C2").Offset(F).Value = GetExName(Files(F))
  58.             MainSheet.Range("D2").Offset(F).Value = Path & "1" & Right("000" & (F + 1), 4) & "." & GetExName(Files(F))
  59.         Next
  60.         GoTo EXT
  61.         


  62. ErrGetDirFiles:
  63.         Call MsgBox("获取文件夹中文件发生错误,文件夹中可能没有文件", vbOKOnly)
  64.         GoTo EXT
  65.         
  66. EXT:
  67. End Sub

  68. '取得文件名的扩展名
  69. Public Function GetExName(ByVal S As String) As String
  70.     Dim I As Long
  71.     I = InStrRev(S, ".")
  72.     If I = -1 Then Exit Function
  73.     GetExName = Mid(S, I + 1)
  74. End Function

  75. '对数组中的字符串进行逻辑排序(升序)
  76. Public Function FilesOrderByLogical(ByRef Files() As String) As String()
  77.     Dim F1 As Long, F2 As Long
  78.     Dim L As Long
  79.     Dim T As String
  80.    
  81.     L = UBound(Files)

  82.     For F1 = 0 To L - 1
  83.         For F2 = F1 + 1 To L
  84.             If StrCmpLogicalW(StrConv(Files(F1), vbUnicode), StrConv(Files(F2), vbUnicode)) > 0 Then
  85.                 T = Files(F1)
  86.                 Files(F1) = Files(F2)
  87.                 Files(F2) = T
  88.             End If
  89.         Next
  90.     Next
  91.     FilesOrderByLogical = Files
  92. End Function

  93. '取得文件夹中的文件,不包含子文件夹
  94. Public Function GetDirFiles(ByVal Path As String) As String()
  95.    
  96.     Dim Files() As String
  97.     Dim C As Long, MAXC As Long
  98.     Dim S As String
  99.    
  100.     MAXC = 100
  101.     ReDim Files(MAXC - 1)
  102.    
  103.     S = Dir(Path)           '第一个文件
  104.     Do While (Len(S))
  105.         Files(C) = S
  106.         C = C + 1
  107.         If C > MAXC Then    '超过数组范围,扩展数组
  108.             MAXC = MAXC * 2
  109.             ReDim Preserve Files(MAXC - 1)
  110.         End If
  111.         S = Dir
  112.     Loop
  113.    
  114.     ReDim Preserve Files(C - 1)
  115.     GetDirFiles = Files
  116. End Function
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2013-8-20 23:52:50 | 显示全部楼层
回复 9# ADSL0125
非常感谢
经测试
获取文件夹不知道是否我操作问题  不能获取文件  总是提示为空
如果能正常获取文件夹的话  能否像BAT那样一个文件夹下实现多个文件夹同时命名呢
再次感谢
发表于 2013-8-20 23:54:28 | 显示全部楼层
本帖最后由 ADSL0125 于 2013-8-20 23:57 编辑

空就对了,EXCEL选择"文件夹"的窗口就是这样
,直接按确定会列出你选择的文件夹下的所有文件

另外,同时对多个文件夹进行操作的话
那么文件序号是跨文件夹累计的,还是每个文件夹重新编号?
 楼主| 发表于 2013-8-21 00:20:30 | 显示全部楼层
回复 11# ADSL0125

命名有文件  但是提示为空啊
多个文件夹下的图片需要独立编号
发表于 2013-8-21 01:00:26 | 显示全部楼层
回复 12# 001011


    Dir 检索文件时,忽略的只读文件和隐藏文件,修改增加对应的标志

   如果还不行的话,试试采用FSO获取文件的方法
 楼主| 发表于 2013-8-21 09:42:38 | 显示全部楼层
非常感谢 目的达到了  就是不能批量有点遗憾  呵呵
发表于 2014-10-28 16:35:13 | 显示全部楼层
回复  001011


    Dir 检索文件时,忽略的只读文件和隐藏文件,修改增加对应的标志

   如果还不行的 ...
ADSL0125 发表于 2013-8-21 01:00


漂亮
64位  Declare PtrSafe Function StrCmpLogicalW Lib "shlwapi" (ByVal S1 As String, ByVal S2 As String) As Integer
   
重命名这个操作坑人,。。。。一不小心手贱点了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 20:50 , Processed in 0.036119 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表