zu 1.
ich schrieb "übergebener Ordner" === "%P"
und nicht "eine Ordner
liste" === "%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
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.vbsCode: 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
'//------------------------------------------------------------------------