Sorry it's probably a dumb question: what is the difference between
Remove-Item -recurse -Force -Verbose
and Remove-Item -Force -Verbose
it seems if we use -recurse
for a folder and subfolders powershell delete file one by one inside the folder. and if we remove the -recurse
powershell simply delete the main folder without checking inside the folder. technically isn't script will run faster without -recurse
?
CodePudding user response:
when you use Remove-Item
on a dir tree that holds files ... and do NOT use -Recurse
, you will get the standard confirmation prompt. so using that parameter makes it run without the delay from the "do you really want to do this?" prompt.
this is one of the reasons that some folks prefer to pipe the output of Get-ChildItem
to Remove-Item
.
CodePudding user response:
tl;dr
Pass both -Recurse
and -Force
to Remove-Item
in order to (more) predictably delete (remove) a given folder, which - barring any permission and timing problems - deletes the folder and any contents it may have.
Caveat: This instantly deletes any contents inside the target folder, and, given that deleted items are not placed in the operating system's recycle bin, can only be recovered, potentially, with specialty software.
it seems if we use
-recurse
for a folder and subfolders powershell delete file one by one inside the folder.
More accurately, it deletes the target folder's subtree, i.e. it recursively deletes all files and subfolders, including their files and subfolders located in the target folder, before deleting the target folder itself. In effect, it deletes the target folder and all of its contents, if any, but note the caveats:
- re "protected" items, which additionally require
-Force
, discussed below. - re intermittent failures due to the file-system APIs being asynchronous in older Windows versions, discussed in the bottom section.
In fact, deleting all the contents of a folder before deleting the folder itself is the only way to delete a nonempty folder, technically: the file-system APIs do not offer deletion of a nonempty folder as a single operation.
Because inadvertently deleting an entire subfolder tree can have disastrous consequences, as a safety mechanism PowerShell requires you to signal the intent to delete a nonempty folder explicitly - by passing -Recurse
.
- If you neglect to pass
-Recurse
and the target folder is nonempty, you get an interactive confirmation prompt - irrespective of whether-Force
is specified or not. Choose[A] Yes to All
(typea
) to delete the folder and all its contents - but see the situational additional need for-Force
below.
That said, you do also need -Force
in order to (more) predictably remove a nonempty target folder, because -Force
makes PowerShell also delete "protected" files and folders, which are hidden files and folders and files that have the ReadOnly
and/or System
attributes set (on Windows).
If you neglect to pass
-Force
when you use-Recurse
or interactively choose[A] Yes to All
in response to the confirmation prompt, the presence of at least one protected item will prevent removal of the target folder as a whole, though unprotected items inside the subtree will get deleted right away.Each protected item will cause a non-terminating error to be emitted, concluded by a non-terminating error that the target folder cannot be removed, because it isn't empty (yet). Perhaps confusingly, in Windows PowerShell the per-protected-item error messages only talks about "[in]sufficient access rights", even though the real problem in this case isn't one of permissions; the error message has been amended in _PowerShell (Core) 7 to explicitly mention hidden, system, and readonly items.
if we remove the
-recurse
powershell simply delete the main folder without checking inside the folder.
No: It follows from the above that you cannot delete a given nonempty folder unless you delete its contents first.
If you attempt that without -Recurse
, you'll invariably get the confirmation prompt (or, in non-interactive scenarios, the call will fail outright).
technically isn't script will run faster without
-recurse
?
It also follows from the above that only an empty folder can be removed without -Recurse
without triggering the confirmation prompt.
If you do also specify -Recurse
when targeting an empty folder, hypothetically unnecessary work of testing whether child items exist could be performed. In practice, Remove-Item
's implementation always performs this test, whether or not you pass -Recurse
.
Even with both -Recurse
and -Force
specified, overall removal may fail:
... due to actual file-system permission problems.
... intermittently, due to running on Windows versions older than Windows 10 20H2 (I don't know that Windows Server version that corresponds to), because file-system item deletion there was inherently asynchronous(!), resulting in intermittent failure to fully delete a given target folder, namely if deletion of an item inside the folder hadn't completed yet by the time deletion of the folder itself was attempted: see this answer for details and a workaround.