找回密码
 加入
搜索
查看: 4709|回复: 7

[效率算法] 批量文件名修改求优化【已解决】,谢谢A大

  [复制链接]
发表于 2013-4-10 11:26:45 | 显示全部楼层 |阅读模式
本帖最后由 骗子 于 2013-4-10 19:27 编辑

程序目录下只有一种文件,要么是目录,要么是文件
名称是一组规律的内容,内容不一定是什么,可能是
888(1),888(2)。。。
或者是
xxxx1,xxxx2,xxxx3....
或者是1,2,3...
但是不管是那种,都会是连续的
现在想将这些东西重命名成 一个指定前缀的名称
我自己的代码虽然能实现文件的重命名,但是有个问题就是如果目录下有1~10这样的文件的话
结果会是这样子的:
  1 --- I1
10 --- I2
  2 --- I3
  3 --- I4
我的想法是 1----I1
                2----I2
                3----I3

#include <File.au3>
#include <array.au3>
#NoTrayIcon
#PRE_UseUpx=N ;使用压缩
$qianzhui = InputBox('请输入前缀', '只需要改名的前缀即可', 'I')
If @error Then Exit
$filelist = _FileListToArray(@ScriptDir)
_ArrayDisplay ($filelist)
$J = 1
If Not @error Then
        For $i = 1 To $filelist[0]
                If $filelist[$i] <> @ScriptName Then
                        $word = StringSplit($filelist[$i], '.')
                        If $word[0] > 1 Then
                                If Not FileExists(@ScriptDir & '\' & $qianzhui & $J & '.' & $word[2]) Then FileMove(@ScriptDir & '\' & $filelist[$i], @ScriptDir & '\' & $qianzhui & $J & '.' & $word[2], 1)
                        Else
                                If Not FileExists(@ScriptDir & '\' & $qianzhui & $J) Then DirMove(@ScriptDir & '\' & $filelist[$i], @ScriptDir & '\' & $qianzhui & $J, 1)
                        EndIf
                        $J += 1
                EndIf
        Next
EndIf


7楼A大的代码
#include <File.au3>

$sQianzhui = InputBox('请输入前缀', '只需要改名的前缀即可', 'I')
If @error Then Exit
_ReNameFromOrder('C:\test', $sQianzhui)

Func _ReNameFromOrder($sDir, $sQianzhui)
        Local $afiles = _FileListToArray($sDir), $sNwNe
        If @Error Then Return
        For $i = 1 To $afiles[0]
                $sNwNe = $sQianzhui & StringRegExpReplace($afiles[$i], '.*?(\d+)\D*?(\..+)?$', '\1\2')
                If @Extended < 1 Then ContinueLoop
                If Not FileExists($sDir & '\' & $afiles[$i] & '\') Then
                        FileMove($sDir & '\' & $afiles[$i], $sDir & '\' & $sNwNe, 1)
                Else
                        DirMove($sDir & '\' & $afiles[$i], $sDir & '\' & $sNwNe, 1)
                EndIf
        Next
EndFunc   ;==>_ReNameFromOrder
发表于 2013-4-10 11:33:19 | 显示全部楼层
如果只是加前缀,根本不需要理会后面的数字吧^
 楼主| 发表于 2013-4-10 11:35:04 | 显示全部楼层
回复 2# afan

主要是目录下的文件名不固定,有可能是直接的文件序号,也有可能是有其他的前缀后缀的
    最后的文件名只要 指定的前缀加序号
发表于 2013-4-10 11:52:47 | 显示全部楼层
回复  afan

主要是目录下的文件名不固定,有可能是直接的文件序号,也有可能是有其他的前缀后缀的
    ...
骗子 发表于 2013-4-10 11:35



    那也可以直接提取文件名的数字,然后在数字前加个前缀就完事了吧
 楼主| 发表于 2013-4-10 12:17:03 | 显示全部楼层
回复 4# afan

现在的问题就是我不会获取序号啊,因为前后缀中也可能会有数字,用\d+获取的不准吧?
发表于 2013-4-10 12:32:50 | 显示全部楼层
回复  afan

现在的问题就是我不会获取序号啊,因为前后缀中也可能会有数字,用\d+获取的不准吧?
骗子 发表于 2013-4-10 12:17



    以最接近后缀名的数字为准,如果没个排序标准怎么命名呢?如果是随意加序号那也就没一楼的问题了,10 --- I2 也就无所谓了。
发表于 2013-4-10 12:48:33 | 显示全部楼层
个人思路,仅供参考
#include <File.au3>

$sQianzhui = InputBox('请输入前缀', '只需要改名的前缀即可', 'I')
If @error Then Exit
_ReNameFromOrder('C:\test', $sQianzhui)

Func _ReNameFromOrder($sDir, $sQianzhui)
        Local $afiles = _FileListToArray($sDir), $sNwNe
        If @Error Then Return
        For $i = 1 To $afiles[0]
                $sNwNe = $sQianzhui & StringRegExpReplace($afiles[$i], '.*?(\d+)\D*?(\..+)?$', '\1\2')
                If @Extended < 1 Then ContinueLoop
                If Not FileExists($sDir & '\' & $afiles[$i] & '\') Then
                        FileMove($sDir & '\' & $afiles[$i], $sDir & '\' & $sNwNe, 1)
                Else
                        DirMove($sDir & '\' & $afiles[$i], $sDir & '\' & $sNwNe, 1)
                EndIf
        Next
EndFunc   ;==>_ReNameFromOrder

评分

参与人数 1金钱 +10 收起 理由
骗子 + 10 谢谢

查看全部评分

发表于 2016-4-14 09:30:42 | 显示全部楼层
收藏了。。谢谢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-14 02:45 , Processed in 0.083590 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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