Mehrfach-Umbenenn-Tool: Dateinamen von anderen Dateien

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
DanielEis
Junior Member
Junior Member
Posts: 4
Joined: 2017-12-17, 11:54 UTC

Mehrfach-Umbenenn-Tool: Dateinamen von anderen Dateien

Post by *DanielEis »

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
DanielEis
Junior Member
Junior Member
Posts: 4
Joined: 2017-12-17, 11:54 UTC

Post by *DanielEis »

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.]
User avatar
Stefan2
Power Member
Power Member
Posts: 4158
Joined: 2007-09-13, 22:20 UTC
Location: Europa

VBScript: Datei in Unterordner umbenennen

Post by *Stefan2 »

Hallo und willkommen!
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
'//------------------------------------------------------------------------



 
DanielEis
Junior Member
Junior Member
Posts: 4
Joined: 2017-12-17, 11:54 UTC

Post by *DanielEis »

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
User avatar
Stefan2
Power Member
Power Member
Posts: 4158
Joined: 2007-09-13, 22:20 UTC
Location: Europa

VBScript: Datei in Unterordner umbenennen

Post by *Stefan2 »

zu 1.

ich schrieb "übergebener Ordner" === "%P"
und nicht "eine Ordnerliste" === "%L"

:D

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 8) ;-)



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 
zu

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
'//------------------------------------------------------------------------




 
DanielEis
Junior Member
Junior Member
Posts: 4
Joined: 2017-12-17, 11:54 UTC

Post by *DanielEis »

Vielen lieben Dank für Deine Mühe!
Ab jetzt sollte ich selbst zurecht kommen. :-)
Post Reply