I am sick of File Explorer's super slow deletion speed, so I tried to write a PowerShell script to make deletion faster, and while it does its job, its speed isn't as high as what I intended it to be.
I have written this:
Function Fast-Delete {
Param(
[Parameter(Valuefrompipeline=$True, Mandatory=$True)] [String]$Directory0
)
Write-Warning "This Process Will Delete Everything In The Target Directory: $Directory0, Do You Want To Confirm Deletion?" -Warningaction Inquire
$Directory=$Directory0
While ((Get-Childitem -Path $Directory0 -Depth 0 -Force).Count -Ne 0) {
If ((Get-Childitem -Path $Directory -Directory -Force -Depth 0).Count -Ne 0) {
$Directory=(Get-Childitem -Path $Directory -Directory -Force -Depth 0).Fullname | Select-Object -Index 0
}
If ((Get-Childitem -Path $Directory -File -Force).Count -Ne 0) {
(Get-Childitem -Path $Directory -File -Recurse -Force).Fullname | Foreach {Remove-Item -Path $_}
}
$Directory1=$Directory
$Directory=$Directory | Split-Path -Parent
Remove-Item -Path $Directory1
}
Remove-Item -Path $Directory0
}
It is significantly faster than explorer, but still isn't ideal, I have tested it, I used it to delete 208,000 files in 1,000 folders , and the folders disappear at speed of 1 per second, so it's about 208 files/s, now the next challenge should be parallelization, But this is currently really way above me, but it shouldn't be too hard, I am just not experienced enough.
Update2
I have managed to make it run in parallel with this script:
function Parallel-Delete {
param(
[Parameter(Valuefrompipeline=$true, Mandatory=$true, Position=0)] [array]$filelist,
[Parameter(Valuefrompipeline=$true, Mandatory=$true, Position=1)] [int]$number
)
0..($filelist.count-1) | Where-Object {$_ % 16 -eq $number} | foreach {Remove-Item -Path $filelist[$_]}
}
Function Fast-Delete {
Param(
[Parameter(Valuefrompipeline=$True, Mandatory=$True)] [String]$Directory0
)
Write-Warning "This Process Will Delete Everything In The Target Directory: $Directory0, Do You Want To Confirm Deletion?" -Warningaction Inquire
$Directory=$Directory0
While ((Get-Childitem -Path $Directory0 -Depth 0 -Force).Count -Ne 0) {
If ((Get-Childitem -Path $Directory -Directory -Force -Depth 0).Count -Ne 0) {
$Directory=(Get-Childitem -Path $Directory -Directory -Force -Depth 0).Fullname | Select-Object -Index 0
}
If ((Get-Childitem -Path $Directory -File -Force).Count -Ne 0) {
If ((Get-Childitem -Path $Directory -File -Force).Count -Ge 128) {
[array]$filelist=(Get-Childitem -Path $Directory -File -Force).Fullname
0..15 | foreach-object {Invoke-Command -ScriptBlock { Parallel-Delete $filelist $_}}
} else {
(Get-Childitem -Path $Directory -File -Force).Fullname | Foreach {Remove-Item -Path $_}
}
}
$Directory1=$Directory
$Directory=$Directory | Split-Path -Parent
Remove-Item -Path $Directory1
}
Remove-Item -Path $Directory0 -erroraction silentlycontinue
}
$Directory0=Read-Host "Please input target directory to be deleted"
Fast-Delete $Directory0
But it still isn't ideal, it isn't 15 times faster as expected, what did I miss?
Edit: simplified the creation of parallel processes.
remove-item
I average 2.4 files/sec; a power shell script forrobocopy /purge
with a blank directory averages 2.4 files/sec (this still analyzes each individual file in the parent directory)... i am about to tryrobocopy /mir
to see if it's any faster. \$\endgroup\$