marabunta
Goto Top

Powershell Dateilistenabfrage beschleunigen

Hallo,

ich habe 50000 Testdateien in einem Ordner und wollte die in eine Textdatei mit der Dateigröße ausgeben.
Das Funktioniert auch, nur geht es mir zu langsam..

1
2
3
    measure-command{@([System.IO.Directory]::GetFiles("C:\test\files","*","AllDirectories"))  |  
    Foreach-Object{(Get-Item $_ |Select -ExpandProperty fullname) + "," + (Get-Item $_ |Select -ExpandProperty length)} |   
    Out-File -FilePath C:\test\result.txt}
Dauer: 52s
1
2
3
4
    measure-command{(Get-ChildItem C:\test\files -Recurse)| %{
    $_.Fullname + "," + $_.length | Out-File -FilePath C:\test\result2.txt  
    } 
    }
Dauer: 59s

Das der zweite Befehl langsamer ist, hat mich überrascht. Hat jemand eine bessere Lösung?
Danke.

Content-ID: 293649

Url: https://administrator.de/forum/powershell-dateilistenabfrage-beschleunigen-293649.html

Ausgedruckt am: 13.04.2025 um 23:04 Uhr

AnkhMorpork
Lösung AnkhMorpork 20.01.2016 aktualisiert um 14:06:19 Uhr
Goto Top
Ay,

ob es hilft, weiß ich nicht - aber zu deiner Variante 1 hier ein paar Anmerkungen:

http://www.admin-source.de/BlogDeu/905/powershell-foreach-und-foreach-o ...

Gruß

Ankh
114757
Lösung 114757 20.01.2016 aktualisiert um 14:06:17 Uhr
Goto Top
Hiermit braucht es im Test nur knapp 10 Sekunden bei 50.000 Dateien (in VM mit vhd auf einer SSD):
1
gci c:\test\files -recurse | %{"$($_.Fullname) - $($_.Length)"} | set-content 'C:\test\result.txt'  
Das ist effizienter als innerhalb der Schleife jedes mal den Output erneut wegzuschreiben.

Gruß jodel32
Marabunta
Marabunta 20.01.2016 um 14:10:23 Uhr
Goto Top
Danke, auf ein ständiges Output zu verzichten hat die Dauer mehr als halbiert! Durch eine kleine Änderung wie im oberen Link beschrieben, konnte ich die Zeit nochmal weiter drücken.
Von 1 Minute auf 3s für 50000 Dateien zu kommen ist erstaunlich!

1
measure-command{gci C:\test\files -recurse | %{"$($_.Fullname),$($_.Length)"} | set-content 'C:\test\result4.txt'}  
9s

1
2
3
4
5
measure-command{
$a=gci C:\test\files -recurse 
$C=Foreach($b in $a){"$($b.Fullname),$($b.Length)"}   
set-content 'C:\test\result5.txt' -Value $c  
}

3s