[PowerShell] Beliebiges Skript für alle Unterordner ausführen

BenoitM

Cadet 3rd Year
Registriert
März 2012
Beiträge
44
Hallo liebe Community,
ich bin auf der Suche nach einem verallgemeinerten Befehl, welcher es möglich macht - ein bereits bestehendes Skript, welches derzeit lediglich in einem bestehenden Ordner agiert - die selbe Funktion auch in allen Unterordnern (-recurse) durchzuführen.

Ich frage deshalb nach einem allgeminen Befehl, um die Arbeit mit dem PDFTKbuilder (open source tool für das splitten von PDFs) sinnvoller zu gestalten.
Die Grundfunktionen dieses tools erlauben leider keine Durchführung einer -recurse Funktion.
"Wildcard" Funktionen gibt es als Basis für den PDFTKbuilder leider auch nicht.

Mein Gedanke ist daher, die PowerShell als "mächtigere" Instanz zu nutzen, um diesen Funktionsmangel zu kompensieren.

Der momentane Befehl, der jedoch rekursiv, für alle PDFs im Ordner H:\PDFTK durchgeführt werden soll, wobei der Output dynamisch, im jeweiligen Ordner in dem das PDF gesplittet wurde, stattfinden soll.

Code:
pdftk H:\PDFTK\Dokument.pdf burst output H:\PDFTK_out\pg_%03d.pdf


Ist das möglich?
 
Zuletzt bearbeitet:
Dann werde ich das wohl versuchen ;)

Ich wollte damit auch das alt bekannte Skript modifizieren, um den derzeit statischen Befehl (auf das Verzeichnis "H:\PDFTK\PDF_0001" fixiert) rekursiv ausführen zu lassen.

Code:
$path = "H:\PDFTK\PDF_0001" # Quellverzeichnis
    $list = gci -path $path | ? {$_.extension -eq ".pdf"}
    $max = 36700160 # 35MB Maximale Verzeichnisgröße
        
    $sum = ($list | measure-object -property length -sum).sum # Summe der Dateigrößen
    $runs = 0
    
    { 
    while ($sum -gt $max)
    {
        $count = 1 # Zähler
        while (($list | select -first $count | measure-object length -sum).sum -lt $max){ # zählt benötigte Dateien für Dateigröße $max
        $count++
    }
    
    # Definition der neuen Verzeichnisse
    $runs++
    $splitline = ((($list | select -first 1 ).name) -split "_") # Splite bis zu "_"
    $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f $runs +"\" # Anzahl der Stellen beim Serializen
     
    new-item ($path + $folder) -type directory
    $list | sort name | select -first $count | move -destination ($path + $folder)
    # lese Ordner neu ein
    $list = gci -path $path | ? {$_.extension -eq ".pdf"}
    $sum = ($list | measure-object -property length -sum).sum
    }
       if(!($sum -gt $max)){
    # verschiebt restliche Dateien
    if($runs -gt 0 -and ($list | measure-object).count -ne 0){ # wenn $list nicht leer
    if(($list | measure-object -property length -sum).sum -lt 10485760){ #kleiner 10MB > kein neuer Ordner
    $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f ($runs) +"\"
    $list | move -destination ($path + $folder)
    }
    else{
    $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f ($runs + 1) +"\"
    new-item ($path + $folder) -type directory
    $list | move -destination ($path + $folder)
    }
    echo "Dateien fertig verpackt - Skript beendet"
    }
 
Ich würde es so machen:


Code:
$arrList = Get-ChildItem "DeinOberstesVerzeichnis" -recurse -filter * |
Where-Object {$_.PSisContainer -eq $true}


foreach ($strItem in $arrList)
{
    $path = $item.fullname
    
    
    $list = gci -path $path | ? {$_.extension -eq ".pdf"}
    $max = 36700160 # 35MB Maximale Verzeichnisgröße
    $sum = ($list | measure-object -property length -sum).sum # Summe der Dateigrößen
    $runs = 0
    {
    while ($sum -gt $max)
    {
    $count = 1 # Zähler
    while (($list | select -first $count | measure-object length -sum).sum -lt $max){ # zählt benötigte Dateien für Dateigröße $max
    $count++
    }
    # Definition der neuen Verzeichnisse
    $runs++
    $splitline = ((($list | select -first 1 ).name) -split "_") # Splite bis zu "_"
    $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f $runs +"\" # Anzahl der Stellen beim Serializen
    new-item ($path + $folder) -type directory
    $list | sort name | select -first $count | move -destination ($path + $folder)
    # lese Ordner neu ein
    $list = gci -path $path | ? {$_.extension -eq ".pdf"}
    $sum = ($list | measure-object -property length -sum).sum
    }
    if(!($sum -gt $max)){
    # verschiebt restliche Dateien
    if($runs -gt 0 -and ($list | measure-object).count -ne 0){ # wenn $list nicht leer
    if(($list | measure-object -property length -sum).sum -lt 10485760){ #kleiner 10MB > kein neuer Ordner
    $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f ($runs) +"\"
    $list | move -destination ($path + $folder)
    }
    else{
    $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f ($runs + 1) +"\"
    new-item ($path + $folder) -type directory
    $list | move -destination ($path + $folder)
    }
    echo "Dateien fertig verpackt - Skript beendet"
    }
}
 
Zuletzt bearbeitet:
Fehlende schließende "}" im Anweisungsblock.
Bei C:\PowerShell\Skript1.ps1:43 Zeichen:6
+ } <<<<
+ CategoryInfo : ParserError: (CloseBraceToken:TokenId) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace


Durch das Hinzufügen von Klammern wird das Skript jedoch nur als Text im Ausgabefenster der PowerShell gedruckt.
 
Wieso machst du überhaupt in Zeile 14 eine geschweifte Klammer? Ist doch dort garnicht nötig.

Probiere es mal so:

Code:
$arrList = Get-ChildItem "DeinVerzeichnis" -recurse -filter * |
    Where-Object {$_.PSisContainer -eq $true}
     
     
    foreach ($strItem in $arrList)
    {
        $path = $strItem.fullname
        $list = gci -path $path | ? {$_.extension -eq ".pdf"}
        $max = 36700160 # 35MB Maximale Verzeichnisgröße
        $sum = ($list | measure-object -property length -sum).sum # Summe der Dateigrößen
        $runs = 0
        
        while ($sum -gt $max)
        {
            $count = 1 # Zähler
            while (($list | select -first $count | measure-object length -sum).sum -lt $max)
            { # zählt benötigte Dateien für Dateigröße $max
                $count++
            }
            # Definition der neuen Verzeichnisse
            $runs++
            $splitline = ((($list | select -first 1 ).name) -split "_") # Splite bis zu "_"
            $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f $runs +"\" # Anzahl der Stellen beim Serializen
            new-item ($path + $folder) -type directory
            $list | sort name | select -first $count | move -destination ($path + $folder)
            # lese Ordner neu ein
            $list = gci -path $path | ? {$_.extension -eq ".pdf"}
            $sum = ($list | measure-object -property length -sum).sum
        }
        if(!($sum -gt $max))
        {
            # verschiebt restliche Dateien
            if($runs -gt 0 -and ($list | measure-object).count -ne 0)
            { # wenn $list nicht leer
                if(($list | measure-object -property length -sum).sum -lt 10485760)
                { #kleiner 10MB > kein neuer Ordner
                    $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f ($runs) +"\"
                    $list | move -destination ($path + $folder)
                }
            }
            else
            {
                $folder = "\" + $splitline[0] +"_" + "{0:D2}" -f ($runs + 1) +"\"
                new-item ($path + $folder) -type directory
                $list | move -destination ($path + $folder)
            }
            echo "Dateien fertig verpackt - Skript beendet"
        }
        
    }
 
Funktioniert leider auch nicht. Erneut ein Klammer-Fehler.
 
Zurück
Oben