按ID替换文件名

时间:2018-01-11 22:15:52

标签: compare

对于网站,我尝试使用VBA / Powershell和/或CSV文件格式化大约5000个文件名:

这些文件目前的文件名如下: blabla_45359_blabla.jpg 45359 - blabla.jpg 其中45359是我们网上商店中商品的ID。 我想格式化这些文件名,因为只有ID才是文件名...所以: 45359.jpg

我尝试在Excel中创建一个显示所有当前文件名的列表,并尝试通过自动过滤掉ID部分来格式化它们,但没有任何成功。

任何提示?

编辑:示例

这实际上取决于文件名,例如我有一个名为的文件:Futterklappe_PrimoLux_60_schwarz_93412_f.jpg 目标是自动将此文件重命名为:93412.jpg

我有一个所有ID的列表,但如果文件名中的某个ID匹配,则应将这些文件重命名为其中一个ID。上面也有一些例外,因为有些文件名会出现多个ID,因此我必须复制这些文件并为每个ID重命名。

2 个答案:

答案 0 :(得分:1)

基于的用户定义函数或UDF似乎是最好的工作表方法。

Option Explicit

Function fixFilename(str As String, ndx As Integer) As String
    Dim tmp As String, ext As String
    Static cmat As Object, regex As Object

    If regex Is Nothing Then
        Set regex = CreateObject("VBScript.RegExp")
        With regex
            .Global = True
            .MultiLine = False
            .IgnoreCase = True
        End With
    Else
        Set cmat = Nothing
    End If

    With regex
        .Pattern = "\d{5}"
        If regex.Test(str) Then
            Set cmat = .Execute(str)
            If ndx <= cmat.Count Then _
                tmp = cmat.Item(ndx - 1)
        End If
    End With

    ext = Mid(str, InStrRev(str, Chr(46)))

    If CBool(Len(tmp)) Then _
        fixFilename = tmp & ext

End Function

在下面的示例图像中,B5已填充到C5以收集第二个ID。

enter image description here

答案 1 :(得分:1)

在PowerShell中,我只使用带有捕获组的正则表达式:

Get-ChildItem -Path $Path -File |
    ForEach-Object {
        if ($_.Name -match '(?<ID>\d{5})') {
            $NewName = $Matches.ID + $_.Extension
            $_ | Rename-Item -NewName $NewName
        }
    }