骗子 发表于 2013-4-10 11:26:45

批量文件名修改求优化【已解决】,谢谢A大

本帖最后由 骗子 于 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
                If $filelist[$i] <> @ScriptName Then
                        $word = StringSplit($filelist[$i], '.')
                        If $word > 1 Then
                                If Not FileExists(@ScriptDir & '\' & $qianzhui & $J & '.' & $word) Then FileMove(@ScriptDir & '\' & $filelist[$i], @ScriptDir & '\' & $qianzhui & $J & '.' & $word, 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
                $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

afan 发表于 2013-4-10 11:33:19

如果只是加前缀,根本不需要理会后面的数字吧^

骗子 发表于 2013-4-10 11:35:04

回复 2# afan

主要是目录下的文件名不固定,有可能是直接的文件序号,也有可能是有其他的前缀后缀的
    最后的文件名只要 指定的前缀加序号

afan 发表于 2013-4-10 11:52:47

回复afan

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


    那也可以直接提取文件名的数字,然后在数字前加个前缀就完事了吧

骗子 发表于 2013-4-10 12:17:03

回复 4# afan

现在的问题就是我不会获取序号啊,因为前后缀中也可能会有数字,用\d+获取的不准吧?

afan 发表于 2013-4-10 12:32:50

回复afan

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


    以最接近后缀名的数字为准,如果没个排序标准怎么命名呢?如果是随意加序号那也就没一楼的问题了,10 --- I2 也就无所谓了。

afan 发表于 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
                $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

pingfan5888 发表于 2016-4-14 09:30:42

收藏了。。谢谢
页: [1]
查看完整版本: 批量文件名修改求优化【已解决】,谢谢A大