[PowerShell] $arrList korrekt in Schleife verwenden

BenoitM

Cadet 3rd Year
Registriert
März 2012
Beiträge
44
Hello World..

Das folgende Skript dient dem Verpacken von Dateien unter Einhaltung einer maximalen Datenmenge.
Kernproblem beim Ausführen des Skripts liegt darin, dass die $arrList zwar korrekt abgerufen wird, jedoch bei der foreach-Schleife nicht übernommen wird.

Die Verzeichnisstruktur sieht wie folgt aus:

H:\Burst
H:\Burst\RekursivPack\
H:\Burst\RekursivPack\BurstUO1
H:\Burst\RekursivPack\BurstUO2

Beim Ausführen des Skripts werden jedoch nur die PDFs im Ordner BurstUO2 verpackt. Das Skript hiernach einfach beendet.

Seht ihr einen\mehrere\den Fehler?

Code:
$arrList = Get-ChildItem H:\Burst\RecursivePack -recurse -directory
$arrList


    foreach ($element in $arrList)
    {
    $path = $element.FullName
    $list = gci -path $path -Recurse | ? {$_.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"
    }
    }
 
Hallo,

ich meine in Zeile 8 weist du $list einen Wert zu und überschreibst hiermit das erste Verzeichnis, oder?
Du müsstest nicht zuweisen sondern an die Liste anhängen.

Gruß,
d2boxSteve
 
Welche Lösung würdest du dafür vorschlagen?
 
So wie ich das sehe hast du einfach nur die Klammer deiner Foreach-SChleife zu früh geschlossen (in Zeile 12). Ich behaupte mal, dass die erst ganz am Ende des PRogrammes geschlossen werden muss!? JEdenfalls funktioniert es so bei mir.

Nebenbei: Wenn du in einem Pfad rekursiv alle vorhandenen Ordner auslesen möchtest, dann mach das lieber so:
Code:
$arrList = Get-Childitem H:\Burst\RecursivePack -Recurse | where {$_.PsIsContainer}

Darüber hinaus finde ich dein Skript auch ziemlich fehleranfällig. Ich weiß ja nicht wie kritisch es ist, aber gerade bei solchen Dateioperationen mit "move-item" sollte man immer ein Try/Catch Block herumbauen. Weil was machst du z.B. wenn eine PDF-Datei zufällig mal im Zugriff ist wenn dein Skript drüberläuft? Diese Fehler solltest du noch dringend abfangen.
 
Zuletzt bearbeitet:
Bei dir funktioniert es mit der veränderten Setzung der Klammer?
Habe in Erinnerung, das bereits versucht zu haben. Werde es testen, sobald ich wieder zum Rechner komme.

Der Fall, wie das ein PDF in gebrauch ist, sollte natürlich nicht vorkommen. Um dieses mögliche Problem jedoch zu kompensieren, werde ich deiner Empfehlung, einen Try-Block herum zu setzten, klar nachgehen.

Danke im Voraus für den Tip.

Kind regards :)

#edit

Funktioniert wunderbar.
 
Zuletzt bearbeitet:
Zurück
Oben