thomasschwenningen
Goto Top

Powershell Script beschleunigen?

Hallo,
ich habe eine Frage zu Powershell.
Ich habe dieses script im Internet gefunden und es funktioniert sehr gut.

Ich habe ein Ordner mit über 100.000 Dateien und das Script ist....langsam im Kopieren?
Kann dieses Powershell script Optimiert werden damit es schneller arbeitet?

Ich benutze das script für folgendes:
Ich habe in einem Ordner ca. 100.000 .html Dateien und das Powershell script soll immer 10.000 Dateien in einzelne Ordner reinkopieren,
so daß am Ende der Arbeit, ich 10 x Ordner mit jeweils 10.000 .html Dateien drin habe face-smile

$filesperfolder = 10000
$sourcePath = "C:\Users\PC\Documents\thomas"  
$destPath = "C:\Users\PC\Documents\thomas\Aufgeteilt"  
$i = 0;
$folderNum = 1;

Get-ChildItem "$sourcePath\*.html" | % {  

    New-Item -Path ($destPath + "\" + $folderNum) -Type Directory -Force  
    Move-Item $_ ($destPath + "\" + $folderNum);  

    $i++;

    if ($i -eq $filesperfolder){
        $folderNum++;
        $i = 0 ;
    }
}

Vielen Dank für alle Tipps.

Gruß

Thomas aus Schwenningen

Content-ID: 2579326001

Url: https://administrator.de/forum/powershell-script-beschleunigen-2579326001.html

Ausgedruckt am: 22.04.2025 um 07:04 Uhr

colinardo
Lösung colinardo 23.04.2022, aktualisiert am 24.04.2022 um 19:03:53 Uhr
Goto Top
Servus Thomas,
ja das hat in der Tat sehr viel Potential für Beschleunigung, dafür muss man nicht jede einzelne Datei auch noch mit einem zusätzlich langsamen Foreach-Object (%{}) durchlaufen sondern teilt die Dateien gleich in Sets auf und schiebt diese in einem Rutsch in die jeweiligen neuen Ordner:
# Dateien pro Ordner
$filesperFolder = 10000
# Quellordner
$sourcePath = "C:\Users\PC\Documents\thomas"  
# Zielordner
$destPath = "C:\Users\PC\Documents\thomas\Aufgeteilt"  
# Dateien auflisten
$files = [IO.Directory]::GetFiles($sourcePath,"*.html")  
# Anzahl an Sets berechnen
$sets = [math]::Ceiling($files.Count / $filesperFolder)
# sets durchlaufen
for ($i = 0; $i -lt $sets; $i++){
    # set in numerierten Zielordner verschieben
    $files[($i*$filesperFolder)..(($i*$filesperFolder)+$filesperFolder-1)] | move-item -destination (md "$destPath\$($i+1)" -Force) -Force  
}

Oder auch eine weiter vereinfachte Variante mit While Schleife
# Dateien pro Ordner
$filesperFolder = 10000
# Quellordner
$sourcePath = "C:\Users\PC\Documents\thomas"  
# Zielordner
$destPath = "C:\Users\PC\Documents\thomas\Aufgeteilt"  
# Dateien auflisten
$files = [IO.Directory]::GetFiles($sourcePath,"*.html")  
# Zählervariablen
$cnt = 0;$i = 1
# so lange es files gibt
while($cnt -lt $files.Count){
   $files | select -Skip $cnt -First $filesperFolder  | move-item -destination (md "$destPath\$i" -Force) -Force  
    $i++;$cnt+=$filesperFolder
}
Man könnte jetzt hier noch das Abfragen der Dateien zusätzlich parallelisieren und beschleunigen aber damit würde ich dich vermutlich überfordern, das sollte es auf jeden Fall erst mal erheblich schneller machen.

Grüße Uwe
ThomasSchwenningen
ThomasSchwenningen 23.04.2022 um 17:17:32 Uhr
Goto Top
Hallo Uwe,
Super Vielen Dank für deine Hilfe.

Leider bekomme ich folgende Fehlermeldung:
fehlermeldung
colinardo
Lösung colinardo 23.04.2022 aktualisiert um 18:00:16 Uhr
Goto Top
Du verwendest noch eine alte Powershell Version < 3.0 die kennt den Parameter -File von Get-ChildItem noch nicht, du kannst das aber Zeile 8 so umschreiben dann geht das auch mit der alten PS <3.0
$files = [IO.Directory]::GetFiles($sourcePath,"*.html")  
Ich würde dir aber dringend raten die Powershell zu aktualisieren die PS <3.0 hat viele Bugs und ist auch nicht besonders performant!
ThomasSchwenningen
ThomasSchwenningen 23.04.2022 um 19:17:08 Uhr
Goto Top
Hallo Uwe,
vielen Dank. Es funktioniert bestens face-smile

Gruß

Thomas
Penny.Cilin
Penny.Cilin 23.04.2022 um 20:00:19 Uhr
Goto Top
Zitat von @ThomasSchwenningen:

Hallo Uwe,
Super Vielen Dank für deine Hilfe.

Leider bekomme ich folgende Fehlermeldung:

Was ist das für ein Betriebssystem? Warum kein aktuelles, mit aktuellen Powershell?

Gruss Penny.
colinardo
colinardo 23.04.2022 aktualisiert um 21:54:57 Uhr
Goto Top
Zitat von @Penny.Cilin:
Was ist das für ein Betriebssystem? Warum kein aktuelles, mit aktuellen Powershell?
Bestimmt ein altes Windows 7 mit out of the box PS 2.0 face-wink. Habe ich oben auch schon drauf hingewiesen das er das in seinem Interesse besser aktualisieren sollte.