Mehrfach-Umbenenn-Tool: Dateinamen von anderen Dateien
Moderators: white, Hacker, Stefan2
Mehrfach-Umbenenn-Tool: Dateinamen von anderen Dateien
Hallo und guten Tag,
hab ein Problem, das ich nicht schaff selbst im Total Commander zu lösen:
Ich möchte viele Dateien gleichen Namens (fanart.jpg), die in einzelnen Verzeichnissen liegen, umbenennen in den Namen einer Videodatei, die in dem gleichen Verzeichnis liegt. Der Ordnername entspricht nicht dem Videonamen.
Im Skripte schreiben bin ich leider nicht geübt und in dem Mehrfach-Umbenenn-Tool, das ich sonst für jedes Umbenenn-Problem verwende, habe ich keinen Zugriff auf andere Dateien.
Vielleicht kennt hier ja jmd. eine Lösung oder hat zumindest eine Idee, bevor ich anfange das manuell umzubenennen.
Beispiel etwas ausführlicher:
Dateistruktur aktuell:
Ordner1/fanart.jpg
Ordner1/video1.mkv
Ordner2/fanart.jpg
Ordner2/video2.mkv
Ordner3/fanart.jpg
Ordner3/video3.mkv
[usw.]
Dateistruktur Ziel:
Ordner1/video1-fanart.jpg
Ordner1/video1.mkv
Ordner2/video2-fanart.jpg
Ordner2/video2.mkv
Ordner3/video3-fanart.jpg
Ordner3/video3.mkv
Vielen Dank und viele Grüße
Daniel
hab ein Problem, das ich nicht schaff selbst im Total Commander zu lösen:
Ich möchte viele Dateien gleichen Namens (fanart.jpg), die in einzelnen Verzeichnissen liegen, umbenennen in den Namen einer Videodatei, die in dem gleichen Verzeichnis liegt. Der Ordnername entspricht nicht dem Videonamen.
Im Skripte schreiben bin ich leider nicht geübt und in dem Mehrfach-Umbenenn-Tool, das ich sonst für jedes Umbenenn-Problem verwende, habe ich keinen Zugriff auf andere Dateien.
Vielleicht kennt hier ja jmd. eine Lösung oder hat zumindest eine Idee, bevor ich anfange das manuell umzubenennen.
Beispiel etwas ausführlicher:
Dateistruktur aktuell:
Ordner1/fanart.jpg
Ordner1/video1.mkv
Ordner2/fanart.jpg
Ordner2/video2.mkv
Ordner3/fanart.jpg
Ordner3/video3.mkv
[usw.]
Dateistruktur Ziel:
Ordner1/video1-fanart.jpg
Ordner1/video1.mkv
Ordner2/video2-fanart.jpg
Ordner2/video2.mkv
Ordner3/video3-fanart.jpg
Ordner3/video3.mkv
Vielen Dank und viele Grüße
Daniel
Ich merke gerade, dass das Beispiel irreführend ist, daher noch ein Versuch:
Beispiel etwas ausführlicher:
Dateistruktur aktuell:
Ordner1/fanart.jpg
Ordner1/ichbin1video.mkv
Ordner2/fanart.jpg
Ordner2/einandererfilm.mkv
Ordner3/fanart.jpg
Ordner3/irgendeinebezeichnung.mkv
[usw.]
Dateistruktur Ziel:
Ordner1/ichbin1video-fanart.jpg
Ordner1/ichbin1video.mkv
Ordner2/einandererfilm-fanart.jpg
Ordner2/einandererfilm.mkv
Ordner3/irgendeinebezeichnung-fanart.jpg
Ordner3/irgendeinebezeichnung.mkv
[usw.]
Beispiel etwas ausführlicher:
Dateistruktur aktuell:
Ordner1/fanart.jpg
Ordner1/ichbin1video.mkv
Ordner2/fanart.jpg
Ordner2/einandererfilm.mkv
Ordner3/fanart.jpg
Ordner3/irgendeinebezeichnung.mkv
[usw.]
Dateistruktur Ziel:
Ordner1/ichbin1video-fanart.jpg
Ordner1/ichbin1video.mkv
Ordner2/einandererfilm-fanart.jpg
Ordner2/einandererfilm.mkv
Ordner3/irgendeinebezeichnung-fanart.jpg
Ordner3/irgendeinebezeichnung.mkv
[usw.]
VBScript: Datei in Unterordner umbenennen
Hallo und willkommen!
Ich denke, dass das MUT das nicht kann ... "abhängig von vorhandenen Dateien eine andere Datei umbenennen"?
Das würde eher ein Skript bewerkstelligen, zB so ein VBScript:
(simples Skript anhand deiner Angaben, ohne allzu viel eigene Intelligenz)
VON:
Ordner1/fanart.jpg
Ordner1/ichbin1video.mkv
ZU:
Ordner1/ichbin1video-fanart.jpg
Ordner1/ichbin1video.mkv
Ich denke, dass das MUT das nicht kann ... "abhängig von vorhandenen Dateien eine andere Datei umbenennen"?
Das würde eher ein Skript bewerkstelligen, zB so ein VBScript:
(simples Skript anhand deiner Angaben, ohne allzu viel eigene Intelligenz)
Code: Select all
'// https://ghisler.ch/board/viewtopic.php?p=336007#336007
'/ VBScript: Für alle unterordner, benenne "fanart.jpg" um in Name der MKV-Datei.
'/ Speichere diesen Code als "zzz.vbs" im Hauptordner der Unterordner.
'/ Zur Ausführung die Datei "zzz.vbs" doppelklicken.
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ARGs = WScript.Arguments
IF ARGs.count > 0 Then
'//übergebener Ordner als Parameter, zB "%P" im TC in Parameterfeld.
vMyWorkingFolder = ARGs(0)
Else
'//nimm den Ordner in dem dieses Skript liegt:
vMyWorkingFolder = FSO.GetParentFolderName(WScript.ScriptFullName)
End If
'//------------------------------------------------------------------------
MB = MsgBox("Arbeitsordner:" & vbLF & vMyWorkingFolder & vbLF & _
"Hier arbeiten?", vbOKCancel + vbQuestion, "Arbeitsordner")
If (MB = vbCancel) Then WScript.Quit
WorkOnSubfolders FSO.GetFolder(vMyWorkingFolder)
Sub WorkOnSubfolders (vMainFolder)
For Each voSubfolder in vMainFolder.SubFolders
For Each voFile in voSubfolder.Files
If LCase(FSO.GetExtensionName(voFile)) = "mkv" Then
If(FSO.FileExists(voSubfolder&"\fanart.jpg")) Then
vBaseName=FSO.GetBaseName(voFile)
FSO.MoveFile voSubfolder&"\fanart.jpg", voSubfolder&"\"&vBaseName&"-fanart.jpg"
Exit For
End If
End If
Next
Next
End Sub
'//------------------------------------------------------------------------
Hallo Stefan2,
vielen lieben Dank, das ist reine Magie! Hat hervorragend funktioniert.
Vielleicht sollte ich mich doch mehr mit vbs beschäftigen. Wenn Du mir beim Verständnis Deines Skripts ein wenig helfen kannst, würde ich mich über eine weitere Antwort sehr freuen:
1. Du schreibst "übergebener Ordner als Parameter, zB "%P" im TC in Parameterfeld": Bedeutet es ich könnte aus dem TC eine Ordnerliste an das Skript übergeben? Wie würde das funktionieren? (Ich habe den zweiten Weg gewählt)
2. Vor lauter "Subfolder" im Skript frage ich mich wie das ganze mit Unterverzeichnissen funktionieren würde.
Danke nochmal und einen schönen Abend!
Viele Grüße
Daniel
vielen lieben Dank, das ist reine Magie! Hat hervorragend funktioniert.
Vielleicht sollte ich mich doch mehr mit vbs beschäftigen. Wenn Du mir beim Verständnis Deines Skripts ein wenig helfen kannst, würde ich mich über eine weitere Antwort sehr freuen:
1. Du schreibst "übergebener Ordner als Parameter, zB "%P" im TC in Parameterfeld": Bedeutet es ich könnte aus dem TC eine Ordnerliste an das Skript übergeben? Wie würde das funktionieren? (Ich habe den zweiten Weg gewählt)
2. Vor lauter "Subfolder" im Skript frage ich mich wie das ganze mit Unterverzeichnissen funktionieren würde.
Danke nochmal und einen schönen Abend!
Viele Grüße
Daniel
VBScript: Datei in Unterordner umbenennen
zu 1.
ich schrieb "übergebener Ordner" === "%P"
und nicht "eine Ordnerliste" === "%L"
Wenn du das nächste Mal in einem geöffneten Button-Dialog bist, drücke die F1-Taste und lies die Hilfe zu diesen Parameter
Um eine "Ordnerliste" abzuarbeiten, muss im Skript entsprechender Code vorhanden sein:
Psuedo-Code:
- für jede Zeile (Ordnername) in TCs "%L"-Liste
- --. mache etwas mit diesem Ordnernamen
VBScript-Code (zumindest ansatzweise, nicht unbedingt 1-zu-1 übernehmbar)
Innerhalb des Codes muss man dann mit 'vCurrentLine' weiterarbeiten (zB sehen ob es sich bei der Zeile [== 'ausgewählte Datei'] um einen Ordner oder eine Datei handelt)
- - -
zu 2.
Rufe die 'Sub'-Prozedur rekursive mit dem gerade verarbeiteten Ordner erneut auf:
ändere
zu
- - -
Hier mal ein funktionierendes Skript, auch für eine Ordnerliste:
Als TC-Button:
Kommando: "L:\aufwerk\Pfad zum\Skript.vbs"
Parameters: "%L"
Skript.vbs
- - -
Und hier mal ein kürzeres Script, aber hier explizit nur für eine Ordnerliste der ausgewählten Ordner ("%L" -Parameter), für ein oder mehrere Ordner.
ich schrieb "übergebener Ordner" === "%P"
und nicht "eine Ordnerliste" === "%L"
Wenn du das nächste Mal in einem geöffneten Button-Dialog bist, drücke die F1-Taste und lies die Hilfe zu diesen Parameter
Um eine "Ordnerliste" abzuarbeiten, muss im Skript entsprechender Code vorhanden sein:
Psuedo-Code:
- für jede Zeile (Ordnername) in TCs "%L"-Liste
- --. mache etwas mit diesem Ordnernamen
VBScript-Code (zumindest ansatzweise, nicht unbedingt 1-zu-1 übernehmbar)
Code: Select all
Set oTextStream = FSO.OpenTextFile(WScript.Arguments(0),1)
Do Until oTextStream.AtEndOfStream
vCurrentLine = oTextStream.ReadLine
MachEtwasMit vCurrentLine
Loop
oTextStream.Close
Innerhalb des Codes muss man dann mit 'vCurrentLine' weiterarbeiten (zB sehen ob es sich bei der Zeile [== 'ausgewählte Datei'] um einen Ordner oder eine Datei handelt)
- - -
zu 2.
Rufe die 'Sub'-Prozedur rekursive mit dem gerade verarbeiteten Ordner erneut auf:
ändere
Code: Select all
Next
Next
End Sub
Code: Select all
Next
WorkOnSubfolders voSubfolder
Next
End Sub
- - -
Hier mal ein funktionierendes Skript, auch für eine Ordnerliste:
Als TC-Button:
Kommando: "L:\aufwerk\Pfad zum\Skript.vbs"
Parameters: "%L"
Skript.vbs
Code: Select all
'// https://ghisler.ch/board/viewtopic.php?p=336027#336027
'// VBScript zur Dateiverarbeitung in übergebenen Ordnern
'/ VBScript: Für alle unterordner, benenne "fanart.jpg" um in Name der MKV-Datei.
'/ Speichere diesen Code als "zzz.vbs" im Hauptordner der Unterordner.
'/ Zur Ausführung die Datei "zzz.vbs" doppelklicken.
'// Oder als TC-Button:
'// Kommando: "L:\aufwerk\Pfad zum\Skript.vbs"
'// Parameters: <<TC-Parameter "%P" oder "%L">>
'//
'//============================================
'//DebugMode = True / False (True= zeige MsgBox und Ende) / (False=führe das komplette Skript aus)
DebugMode = false
'//============================================
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSC = Wscript.CreateObject("WScript.Shell")
Set ARGs = WScript.Arguments
'//============================================
'// erkenne das übergebene Argument:
IF ARGs.count > 0 Then
vProvidedArgument = ARGs(0)
'//===========
'//als Parameter übergebener AKTUELLER Pfad mittels "%P" im TC Parameterfeld.
'//als Parameter übergebener AUSGEWÄHLTER Orndername mittels "%P%O%E" im TC Parameterfeld.
If(FSO.FolderExists(vProvidedArgument))Then vMyWorkingFolder = vProvidedArgument
'//===========
'//als Parameter übergebenee OrdnerLISTE der AUSGEWÄHLTEN Ornder mittels "%L" im TC Parameterfeld.
'//C:\Users\myUserName\AppData\Local\Temp\CMD7B3A.tmp
UserTEMP = WSC.ExpandEnvironmentStrings("%tmp%")
TempFilePath = FSO.GetParentFolderName(vProvidedArgument)
TempFileExt = FSO.GetExtensionName(vProvidedArgument)
'MsgBox UserTEMP & vbLF & TempFilePath & vbLF & TempFileExt, , "Debug message"
If(TempFilePath = UserTEMP) AND (TempFileExt = "tmp") Then vMyFolderList = vProvidedArgument
'//===========
Else
'//nimm den Ordner in dem dieses Skript liegt:
vMyWorkingFolder = FSO.GetParentFolderName(WScript.ScriptFullName)
End If
'//============================================
'// frage den Anwender:
MB = MsgBox("Arbeitsordner:" & vbLF & vMyWorkingFolder & vMyFolderList & vbLF & "OK oder abbrechen?", _
vbOKCancel + vbQuestion, "Arbeitsordner (DebugMode: " & DebugMode & ")")
If (MB = vbCancel) Then WScript.Quit
'//============================================
'// je nach übergebenem Argument, lies die "%L"-Liste oder nicht:
If(vMyFolderList <> "") Then
If(DebugMode) Then WSC.run "notepad " & vMyFolderList : WScript.Quit
If FSO.FileExists(vMyFolderList) Then
Set oTextStream = FSO.OpenTextFile(vMyFolderList,1)
Do Until oTextStream.AtEndOfStream
vCurrentLine = oTextStream.ReadLine
WorkOnSubfolders vCurrentLine
WorkOnFolder vCurrentLine
Loop
oTextStream.Close
End If
ElseIf(vMyWorkingFolder <> "") Then
If(DebugMode) Then MsgBox vMyWorkingFolder : WScript.Quit
WorkOnSubfolders vMyWorkingFolder
End If
'//------------------------------------------------------------------------ Nur den Ordner selbst:
Sub WorkOnFolder (strDirectoryPath)
'// Verarbeite den übergebenen Ordnername selbst:
'MsgBox strDirectoryPath, , "Debug message WorkOnFolder strDirectoryPath"
Set objMainFolder = FSO.GetFolder(strDirectoryPath)
For Each oFile in objMainFolder.Files
DoIt oFile
Next
End Sub
'//------------------------------------------------------------------------ Alle Unterordner des Ordners:
Sub WorkOnSubfolders (strDirectoryPath)
'// Verarbeite den die Unterordner des übergebenen Ordnernamens:
'MsgBox strDirectoryPath, , "Debug message WorkOnSubfolders strDirectoryPath"
Set objMainFolder = FSO.GetFolder(strDirectoryPath)
For Each oSubfolder in objMainFolder.SubFolders
For Each oFile in oSubfolder.Files
DoIt oFile
Next
'//Für Unterordner der Unterordner rufe das Skript erneut auf:
WorkOnSubfolders oSubfolder
Next
End Sub
'//------------------------------------------------------------------------ Individuelles Anwender-Script:
Sub DoIt(oFile)
'//Individual Script, je nach Anwendungsfall:
'MsgBox oFile, , "Debug message oFile"
strParentFolder = FSO.GetParentFolderName(oFile)
If LCase(FSO.GetExtensionName(oFile)) = "mkv" Then
If(FSO.FileExists(strParentFolder&"\fanart.jpg")) Then
strBaseName=FSO.GetBaseName(oFile)
FSO.MoveFile strParentFolder&"\fanart.jpg", strParentFolder&"\"&strBaseName&"-fanart.jpg"
End If
End If
End Sub 'DoIt
'//------------------------------------------------------------------------
- - -
Und hier mal ein kürzeres Script, aber hier explizit nur für eine Ordnerliste der ausgewählten Ordner ("%L" -Parameter), für ein oder mehrere Ordner.
Code: Select all
'// https://ghisler.ch/board/viewtopic.php?p=336027#336027
'// VBScript zur Dateiverarbeitung in übergebenen Ordnern
'// Individueller Code: Für alle unterordner, benenne "fanart.jpg" in ausgewählten Ordnern um in Name der MKV-Datei.
'TC-Button:
'Kommando: "L:\aufwerk\Pfad zum\Skript.vbs"
'Parameters: "%L"
'//------------------------------------------------------------------------
Set FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.count > 0 Then
vTCTempList = WScript.Arguments(0)
Else
MsgBox "Nichts markiert oder TC-Parameter fehlt!",,"TC-VBScript"
WScript.Quit
End If
'//------------------------------------------------------------------------
Set oTextStream = FSO.OpenTextFile(vTCTempList,1)
'//für jede ausgewählte Datei oder Ordner
Do Until oTextStream.AtEndOfStream
vCurrentLine = oTextStream.ReadLine
'//Nur wenn es ein Ordner ist (TC hängt bei Ordnern ein "\" an)
If(right(vCurrentLine,1)="\")Then
'//Übergebener Ordnername
Set objMainFolder = FSO.GetFolder(vCurrentLine)
For Each oFile in objMainFolder.Files
DoIt oFile
Next
'//Unterordner des Hauptordners:
WorkOnSubfolders vCurrentLine
End If 'a folder
Loop
oTextStream.Close
'//------------------------------------------------------------------------
Sub WorkOnSubfolders(strPath)
'//Sub-Routine um alle UNterordner ab zu arbeiten:
Set objMainFolder = FSO.GetFolder(strPath)
For Each oSubfolder in objMainFolder.SubFolders
For Each oFile in oSubfolder.Files
DoIt oFile
Next
'//Für Unterordner der Unterordner rufe die Routine erneut auf:
WorkOnSubfolders oSubfolder
Next
End Sub 'WorkOnSubfolders
'//------------------------------------------------------------------------
Sub DoIt(oFile)
'//Individual Script, je nach Anwendungsfall:
'MsgBox oFile, , "Debug message oFile"
strParentFolder = FSO.GetParentFolderName(oFile)
If LCase(FSO.GetExtensionName(oFile)) = "mkv" Then
If(FSO.FileExists(strParentFolder&"\fanart.jpg")) Then
strBaseName=FSO.GetBaseName(oFile)
FSO.MoveFile strParentFolder&"\fanart.jpg", strParentFolder&"\"&strBaseName&"-fanart.jpg"
End If
End If
End Sub 'DoIt
'//------------------------------------------------------------------------