循环重命名多个文件

Renaming multiple files in a loop

我有一个包含 8 个 Excel 个文件的文件夹,其命名约定如下:

date_All_Groups
date_HRFull_Status_All
date_RME_Groups_Excluded

这些文件用于月度报告,因此日期显然总是不同的。 我将使用宏来操作每个工作表中的数据,但是由于文件名(日期)的变化我无法创建宏 - 我唯一的保证是这些文件中的每一个都肯定包含部分字符串匹配。

我有一个脚本可以在该位置找到文件并重命名文件,但它只重命名 1 个文件,而不是文件夹中的第一个文件。

我的问题是有效使用 For Each 循环。

这是我的代码:

Dim fso, folder, file
Dim folderName, searchFileName, renameFile1, renameFile2, renameFile3, renameFile4, renameFile5, renameFile6, renameFile7, renameFile8

'Path
folderName = "C:\test\"

'Future FileName
renameFile1 = "All Groups.csv"
renameFile2 = "Groups Excluded.csv"
renameFile3 = "No Exclusions.csv"
renameFile4 = "HR.csv"
renameFile5 = "AD Users.csv"
renameFile6 = "Encryption Status.csv"
renameFile7 = "ePO4 Not Encrypted.csv"
renameFile8 = "ePO5 Not Encrypted.csv"

' Create filesystem object and the folder object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderName)

' Loop over all files in the folder until the searchFileName is found
For Each file In folder.Files
    ' See If the file starts with the name we search
    If InStr(file.Name, "All_Groups") then
        file.Name = renameFile1
    End If

    If InStr(file.Name, "Groups_Excluded") Then
        file.Name = renameFile2
    End If

    If InStr(file.Name, "No_Exclusions") Then
        file.Name = renameFile3
    End If

    If InStr(file.Name, "HR") Then
        file.Name = renameFile4
    End If

    If InStr(file.Name, "AD_Users") then
        file.Name = renameFile5
    End If

    If InStr(file.Name, "Encryption_Status") then
        file.Name = renameFile6
    End If

    If InStr(file.Name, "ePO4") then
        file.Name = renameFile7
    End If

    If InStr(file.Name, "ePO5") then
        file.Name = renameFile8
    End If

    Exit For

    ' echo the job is completed
    WScript.Echo "Completed!"
Next

我找到的原始代码与上面完全相同,但是在 For Each 循环中只有一个 If 语句,而 Exit ForIf 语句中。

目前,当我执行脚本时,代码仅重命名一个文件,并且始终首先重命名 HR 文件。 如果我再次执行该脚本,它会从所有组开始,然后是排除的组,依此类推。

而 "Echo Completed" 也没有做任何事情。

如果文件具有相同的 "date" 你只需要为此查找,例如(如果日期是 iso 日期 "YYYYMMDD")(Date Returns "today"日期)

IsoDate=CStr(Year(Date)) & Right("0" & CStr(Month(Date)),2) & Right("0" & CStr(Day(Date)),2)

每个人的:

For Each file In folder.Files
    If InStr(file.Name, IsoDate) = 1 then 'if is in the start of the string
        file.Name = Mid(file.Name, Len(IsoDate)+1) 'The same name with out date
    End IF
Next

如果您只想将文件重命名为 "canonical" 名称,您可以这样做,假设您只想删除文件名开头的日期并将下划线替换为空格:

Set re = New RegExp
re.Pattern = "\d{4}-\d{2}-\d{2}_(.*\.csv)"

For Each f In folder.Files
    For Each m In re.Execute(f.Name)
        f.Name = Replace(m.Submatches(0), "_", " ")
    Next
Next