Ja, effekten i vad som raderas är den samma, men mitt sätt är snabbare.
Kolla här:
PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_}
PS C:\Users\pvz\zzz> Measure-Command {
>> foreach ($file in $files) {Remove-Item $file | out-null}
>> } | Select TotalSeconds
TotalSeconds
------------
0,9813465
PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_}
PS C:\Users\pvz\zzz> Measure-Command {
>> $files | Remove-Item
>> } | Select TotalSeconds
TotalSeconds
------------
0,3990681
PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_}
PS C:\Users\pvz\zzz> Measure-Command {
>> Remove-Item $files
>> } | Select TotalSeconds
TotalSeconds
------------
0,8012693
PS C:\Users\pvz\zzz>
Tog även med Remove-Item $files
, förväntade mig att detta skulle vara ungefär lika snabbt som $files|Remove-Item
men icke!
Testa gärna själv. Jag har bara tagit med en körning här ovan, men jag har kört flera gånger med konsekventa resultat. Mitt testsystem är en Ryzen 5 1600 @ 3,8 GHz och en Samsung 960 Evo 250GB NVMe (formaterad med NTFS) med PowerShell 5.1 på Windows 10 64-bit.
I allmänhet (oavsett programmeringsspråk) är det mycket smartare att när det går skicka in en lista på saker en funktion ska göra, istället för att bara anropa funktionen N gånger. Då kan funktionen optimera hur den jobbar. Tänk dig en robot som kan åka till Ica och handla grejer. Givet en inköpslista, är det mer effektivt att skicka ut roboten en gång för varje grej du vill köpa, eller är det mer effektivt att skicka med inköpslistan med roboten?
Att $files|Remove-Item
är snabbare än Remove-Item $files
kan jag inte förklara. Men jag antar att Microsoft som skrev Remove-Item
bara optimerat den ena anropsmetoden, inte den andra. Oavsett så är båda metoderna snabbare än din loop.
Meningen med det här är så klart inte att kritisera ditt program, det löser ju så klart TS uppgift helt galant! Men jag ville bara belysa att det finns ett enklare, bättre och snabbare sätt.