如何递归使用PowerShell 2.0删除整个目录?
-
20-09-2019 - |
题
什么是强制删除目录及其在PowerShell中所有子目录的最简单的方法?我使用的PowerShell V2在Windows 7中。
我已经从多个渠道获悉,最明显的命令,Remove-Item $targetDir -Recurse -Force
,无法正常工作。这包括,指出的PowerShell V2联机帮助在一份声明中(使用Get-Help Remove-Item -Examples
找到):
...因为在此cmdlet的Recurse参数故障,该命令使用Get-Childitem cmdlet来获取所需的文件,它使用管道运算符将它们传递给Remove-项目cmdlet的...
我已经看到,使用获取-ChildItem 并管它删除-项目强>各种示例,但是实施例通常删除一些文件集基于滤波器,而不是整个目录。
我寻找吹出整个目录,文件和子目录的干净的方式,而不会产生使用的代码量最少的任何用户的警告消息。一个班轮将是很好,如果它是容易理解的。
解决方案
Remove-Item -Recurse -Force some_dir
确实工作作为标榜这里
rm -r -fo some_dir
是工作太速记别名。
据我的理解,-Recurse
参数只是不正确,当您尝试递归删除过滤文件集的工作。杀死一个单一的目录和下面的一切,似乎很好地工作。
其他提示
我使用:
rm -r folderToDelete
这适用于我就像一个魅力(I偷走了从Ubuntu的)。
当递归地使用简单Remove-Item "folder" -Recurse
删除文件有时会看到的间歇错误:[folder] cannot be removed because it is not empty.
此答案试图防止该错误通过单独删除的文件。
function Get-Tree($Path,$Include='*') {
@(Get-Item $Path -Include $Include -Force) +
(Get-ChildItem $Path -Recurse -Include $Include -Force) |
sort pspath -Descending -unique
}
function Remove-Tree($Path,$Include='*') {
Get-Tree $Path $Include | Remove-Item -force -recurse
}
Remove-Tree some_dir
这是重要的细节是所有pspath -Descending
的物品,以使叶根之前删除的排序。排序是在pspath
参数的做法,因为有更多比文件系统的其他供应商合作的机会。如果您想要过滤的项目删除-Include
参数只是一个方便。
它分成两个功能,因为我觉得它有用,看看有什么我即将运行删除
Get-Tree some_dir | select fullname
rm -r ./folder -Force
...为我工作
尝试这个例子。如果该目录不存在,不会引发错误。您可能需要的PowerShell 3.0。
remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
使用老派DOS命令:
rd /s <dir>
要避免“目录不是空”公认的答案的错误,只要使用好老的DOS命令之前建议。全PS语法准备的复制粘贴是:
& cmd.exe /c rd /S /Q $folderToDelete
由于某种原因,约翰·里斯的回答有时并没有我的情况下工作。但它使我在下面的方向。 首先,我尝试与车-recurse选项递归地删除该目录。后来我陷入每一个剩下的子目录,并删除所有文件。
function Remove-Tree($Path)
{
Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue
if (Test-Path "$Path\" -ErrorAction silentlycontinue)
{
$folders = Get-ChildItem -Path $Path –Directory -Force
ForEach ($folder in $folders)
{
Remove-Tree $folder.FullName
}
$files = Get-ChildItem -Path $Path -File -Force
ForEach ($file in $files)
{
Remove-Item $file.FullName -force
}
if (Test-Path "$Path\" -ErrorAction silentlycontinue)
{
Remove-Item $Path -force
}
}
}
我把通过@约翰 - 里斯以上启发另一种方法 - 尤其是当他的做法开始在一些点失败对我来说。可以通过路径长度基本上递归的子树和排序文件 - 从最长删除到最短
Get-ChildItem $tfsLocalPath -Recurse | #Find all children
Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} | #Calculate the length of their path
Sort-Object PathLength -Descending | #sort by path length descending
%{ Get-Item -LiteralPath $_.FullName } |
Remove-Item -Force
关于-LiteralPath神奇,这里的另一个gotchya可以打你: https://superuser.com/q/212808
真正简单的:
remove-item -path <type in file or directory name>, press Enter
<强>另一个有用的技巧:强>
如果您发现有很多相同或相似的命名惯例(像点前缀名称...那个著名的文件pulltion Mac文件),你可以很容易地从这样的PowerShell的一个单行删除文件:
ls -r .* | rm
这行是要去掉名称中的当前目录中开始时的点,并与其他文件夹中的相同情况下,这个目录中太的所有文件中的所有文件。使用时要注意一下。 :d
删除整个文件夹树有时工作,有时失败,“目录不为空”的错误。随后试图检查文件夹仍然存在可能导致“拒绝访问”或“未经授权的访问”错误。我不知道为什么会这样,但一些有识之士可以从这个StackOverflow的来获得发布。
我已经能够通过指定的文件夹中的项目都将被删除的顺序,并通过添加延迟来解决这些问题。以下运行良好对我来说:
# First remove any files in the folder tree
Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force
# Then remove any sub-folders (deepest ones first). The -Recurse switch may be needed despite the deepest items being deleted first.
ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force }
# Then remove the folder itself. The -Recurse switch is sometimes needed despite the previous statements.
Remove-Item -LiteralPath $FolderToDelete -Recurse -Force
# Finally, give Windows some time to finish deleting the folder (try not to hurl)
Start-Sleep -Seconds 4
有一个Microsoft TechNet文章使用计算的性能的PowerShell中是有帮助我在获得由深度排序的子文件夹的列表。
使用类似的可靠性问题的 RD / S / Q 强>可以通过运行的 RD / S / Q 强>两次解决 - 在之间理想地暂停(即,使用的平强>如下所示)。
RD /S /Q "C:\Some\Folder\to\Delete" > nul
if exist "C:\Some\Folder\to\Delete" ping -4 -n 4 127.0.0.1 > nul
if exist "C:\Some\Folder\to\Delete" RD /S /Q "C:\Some\Folder\to\Delete" > nul
要删除的全部内容包括文件夹结构中使用
get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}
在-recurse
加入remove-item
确保交互提示都被禁用。
del <dir> -Recurse -Force # I prefer this, short & sweet
OR
remove-item <dir> -Recurse -Force
如果你有一个庞大的目录,然后我通常做的是
while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}
上的另一终端的powershell运行此,它将停止当它完成。
$users = get-childitem \\ServerName\c$\users\ | select -ExpandProperty name
foreach ($user in $users)
{
remove-item -path "\\Servername\c$\Users\$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse
Write-Warning "$user Cleaned"
}
上面写了清理一些日志文件,而不删除父目录,这完美的作品!
rm -r <folder_name>
c:\>rm -r "my photos"