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..

    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
    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-Key: 293649

Url: https://administrator.de/contentid/293649

Printed on: April 25, 2024 at 07:04 o'clock

Member: AnkhMorpork
Solution AnkhMorpork Jan 20, 2016 updated at 13:06:19 (UTC)
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
Mitglied: 114757
Solution 114757 Jan 20, 2016 updated at 13:06:17 (UTC)
Goto Top
Hiermit braucht es im Test nur knapp 10 Sekunden bei 50.000 Dateien (in VM mit vhd auf einer SSD):
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
Member: Marabunta
Marabunta Jan 20, 2016 at 13:10:23 (UTC)
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!

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

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