I would like to delete all the files and subfolders from a folder except read-only files.
How to do it using powershell?
For reference, this is a bit easier in V3:
Get-ChildItem -Attributes !r | Remove-Item -Recurse -Force -WhatIf
or the short (alias) version:
dir -at !r | ri -r -f -wh
The only objects that can be read-only are files. When you use the Get-ChildItem
cmdlet you are getting objects of type System.IO.FileInfo
and System.IO.DirectoryInfo
back. The FileInfos have a property named IsReadOnly
. So you can do this one liner:
dir -recurse -path C:\Somewhere | ? {-not $_.IsReadOnly -and -not $_.PsIsContainer} | Remove-Item -Force -WhatIf
The PsIsContainer
property is created by PowerShell (Ps prefix gives it away) and tells whether or not the item is a file or folder. We can use this to pass only files to Remove-Item
.
Remove -WhatIf
when you are ready to delete for real.
Check the attribute of each folder and file and then do a conditional based deletion. This is just the pseudo code.
If (-not (a readonly file)) {
delete file
}
So, to check if a given file or folder is readonly:
$item = Get-Item C:\Scripts\Test.txt
$item.IsReadOnly
HTH