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
Vielen Dank für alle Tipps.
Gruß
Thomas aus Schwenningen
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
$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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2579326001
Url: https://administrator.de/forum/powershell-script-beschleunigen-2579326001.html
Ausgedruckt am: 22.04.2025 um 07:04 Uhr
6 Kommentare
Neuester Kommentar
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:
Oder auch eine weiter vereinfachte Variante mit While Schleife
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
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
}
Grüße Uwe
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
Ich würde dir aber dringend raten die Powershell zu aktualisieren die PS <3.0 hat viele Bugs und ist auch nicht besonders performant!
$files = [IO.Directory]::GetFiles($sourcePath,"*.html")
Zitat von @ThomasSchwenningen:
Hallo Uwe,
Super Vielen Dank für deine Hilfe.
Leider bekomme ich folgende Fehlermeldung:
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.
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 Was ist das für ein Betriebssystem? Warum kein aktuelles, mit aktuellen Powershell?