
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.