什么是强制删除目录及其在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"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top