在PowerShell中强制删除文件和目录有时会失败,但并非总是如此

我试图用rm -Force -Recurse somedirectoryrecursion删除一个目录,我得到几个“目录不是空的”错误。 如果我重试相同的命令 ,它会成功。

例:

 PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime\_svn: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (RunTime:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (Data:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (FileHelpers.Tests:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit\_svn: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (nunit:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (Libs:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers: The directory is not empty. At line:1 char:3 + rm <<<< -Force -Recurse .\FileHelpers + CategoryInfo : WriteError: (I:\Documents an...net\FileHelpers:DirectoryInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers PS I:\Documents and Settings\m\My Documents\prg\net> 

当然,这并不总是发生。 此外,它不会发生只有_svn目录,我没有一个TortoiseSVNcaching或类似的东西,所以没有什么是阻止目录。

有任何想法吗?

help Remove-Item说:

此cmdlet中的Recurse参数无法正常工作。

由于此cmdlet中的Recurse参数存在错误,因此该命令使用Get-Childitem cmdlet来获取所需的d文件,并使用pipe道运算符将它们传递给Remove-Item cmdlet。

并提出这个替代scheme作为例子:

 get-childitem * -include *.csv -recurse | remove-item 

所以你应该get-childitem -recurse变成remove-item

@JamesCW:问题仍然存在于PowerShell 4.0中

我尝试了另一种解决方法,它工作:使用cmd.exe:

 &cmd.exe /c rd /s /q $somedirectory 

新版本的PowerShellPSVersion 4.0 )已经完全解决了这个问题, Remove-Item "targetdirectory" -Recurse -Force没有任何计时问题。

您可以通过在ISE或PowerShell提示符下运行$PSVersiontable来检查您的版本。 4.0是Windows 8.1Server 2012 R2附带的版本,也可以安装在以前版本的Windows上。

目前的答案实际上不会删除一个目录,只是它的子目录。 此外,它将有嵌套目录的问题,因为它将再次尝试删除其内容之前的目录。 我按照正确的顺序写了一些东西来删除这些文件,但是仍然会遇到同样的问题,尽pipe有时这个目录还是会在后面。

所以,现在我用一些能够捕捉exception的东西,等待,然后重试(3次):

现在我使用这个:

 function EmptyDirectory($directory = $(throw "Required parameter missing")) { if ((test-path $directory) -and -not (gi $directory | ? { $_.PSIsContainer })) { throw ("EmptyDirectory called on non-directory."); } $finished = $false; $attemptsLeft = 3; do { if (test-path $directory) { rm $directory -recurse -force } try { $null = mkdir $directory $finished = $true } catch [System.IO.IOException] { Start-Sleep -Milliseconds 500 } $attemptsLeft = $attemptsLeft - 1; } while (-not $finished -and $attemptsLeft -gt 0) if (-not $finished) { throw ("Unable to clean and recreate directory " + $directory) } } 

删除目录及其内容需要两个步骤。 首先删除内容,然后删除文件夹本身。 使用解决方法错误的recursion删除项目解决scheme将如下所示:

 Get-ChildItem -Path "$folder\\*" -Recurse | Remove-Item -Force -Recurse Remove-Item $folder 

这样你可以删除父目录。

这是我的工作:

 $Target = "c:\folder_to_delete" Get-ChildItem -Path $Target -Recurse -force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force Remove-Item -Recurse -Force $Target 

第一行删除树中的所有文件。 第二个删除包括顶部的所有文件夹。

首先使用Takeown.exe取得文件/目录的所有权,然后删除

https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/