Benötigen Sie Hilfe beim Erstellen einer Batchdatei zum Umbenennen mehrerer Ordner?

Benötigen Sie Hilfe beim Erstellen einer Batchdatei zum Umbenennen mehrerer Ordner?

Ich habe über 12.000 Ordner, die ich umbenennen möchte, und zwar mit den ersten 12 Zeichen der ersten Datei in jedem Ordner. Ich habe beispielsweise einen Ordner mit dem Namen „1“, aber darin befinden sich mehrere PDF-Dateien, und die erste aufgelistete hat den Dateinamen „201405090360.pdf“. Ich möchte den Ordner in „201405090360“ umbenennen. Ist das möglich?

Antwort1

Das Folgende hat sich als hilfreich erwiesen. Es könnte durch mehr Fehlerbehandlung verbessert werden, sollte aber funktionieren oder als Ausgangspunkt für ein vollständigeres Skript dienen.

Anmerkungen:

Das VBScript-Skript sollte sich gemäß der folgenden Baumansicht im selben Verzeichnis wie der übergeordnete Ordner befinden.

Die Variable strPath oben sollte in den Namen des übergeordneten Verzeichnisses geändert werden, also von „Start“

Ändern Sie blnDoIt von „false“ in „true“, um tatsächlich Änderungen vorzunehmen.

Schlagen Sie vor, es zuerst wie folgt auszuführen: cscript process.vbs > log.txt

Wenn die Protokolldatei korrekt aussieht, ändern Sie blnDoIt auf „true“.

' Given this structure:
'
'│   process.vbs
'│
'└───Start
'    ├───1
'    │       123456789012aaa.txt
'    │       123456789013bbb.txt
'    │
'    ├───2
'    │       223456789012ccc.txt
'    │       223456789013ddd.txt
'    │
'    ├───3
'    │       323456789012eee.txt
'    │       323456789013fff.txt
'    │
'    ├───4
'    │       423456789012ggg.txt
'    │       423456789013hhh.txt
'    │
'    ├───5
'    │       523456789012iii.txt
'    │       523456789013jjj.txt
'    │
'    └───6
'            623456789013kkk.txt
'            623456789012jjj.txt

'===================================================================================    

dim strPath : strPath = "Start"
dim blnDoIt : blnDoIt = false

'===================================================================================
dim objFSO                  : set objFSO = CreateObject("Scripting.FileSystemObject")
dim objFolder               : set objFolder = objFSO.GetFolder(strPath)
dim strPGetAbsolutePathName : strPGetAbsolutePathName = objFSO.GetAbsolutePathName(strPath)
dim colSubfolders           : set colSubfolders = objFolder.Subfolders

'===================================================================================
for each objSubfolder in colSubfolders
    strNameOfFolder = objSubfolder.Name

    wscript.echo "Processing directory: " & strNameOfFolder
    strFileNameToUse = GetFileNameToUseAsParentDir (strNameOfFolder)

    if strFileNameToUse <> -1 then

      wscript.echo " > Chosen file to represent directory: " & strFileNameToUse
      strLeft12 = left (strFileNameToUse, 12)
      wscript.echo " > First 12 characters of file: " & strLeft12

      if blnDoIt then
        wscript.echo " > Renaming directory " & strPGetAbsolutePathName & "\" & strNameOfFolder & " to " & strPGetAbsolutePathName & "\" & strLeft12
        objFSO.MoveFolder strPGetAbsolutePathName & "\" & strNameOfFolder, strPGetAbsolutePathName & "\" & strLeft12
      else
        wscript.echo " > Rename directory " & strPGetAbsolutePathName & "\" & strNameOfFolder & " to " & strPGetAbsolutePathName & "\" & strLeft12
      end if

    else
    wscript.echo " > Skipping."
    end if

    wscript.echo ""
next
'===================================================================================

'===================================================================================
Function GetFileNameToUseAsParentDir(strDir)

    dim oFiles : Set oFiles = CreateObject("System.Collections.ArrayList")

    dim oF : set oF = objFSO.GetFolder(strPGetAbsolutePathName & "\" & strDir).Files

    wscript.echo " > " & oF.count & " files in directory."

    if oF.count > 0 then

      for each oFile In oF
        oFiles.Add oFile.name
      next

      oFiles.Sort

      GetFileNameToUseAsParentDir = oFiles(0)

    else
      GetFileNameToUseAsParentDir = -1
    end if

    set oFiles = nothing

End Function
'===================================================================================

Antwort2

Ich würde Powershell verwenden. Wenn ich Ihre Angaben richtig verstanden habe, sollte das hier funktionieren:

# Get List of subfolders
$Folders = Get-ChildItem <FOLDER> -Directory
# Process each subfolder
Foreach ($Subfolder in $Folders){
     # Get the names all files in current subfolder
     $FileNames = (Get-ChildItem $Subfolder.FullName -File).Name
     # If folder was not empty
     if ($FileNames) {
         # Replace current name of folder with first 12 chars of the name of the first file 
         Rename-Item $Subfolder.FullName $FileNames[0].Substring(0,12) -WhatIf
    }
}

Ersetzen Sie es durch Ihren tatsächlichen Ordner, speichern Sie es als *.ps1-Datei, öffnen Sie eine Powershell und führen Sie es aus.

Zeigt nur die Ergebnisse an und ändert nichts, bis Sie „-Whatif“ aus der dritten Zeile von unten entfernen.

verwandte Informationen