如何通过命令提示符清空回收站?

Posted

技术标签:

【中文标题】如何通过命令提示符清空回收站?【英文标题】:how to empty recyclebin through command prompt? 【发布时间】:2012-03-03 13:57:48 【问题描述】:

通常我们通过用鼠标右键单击并选择“清空回收站”来删除回收站内容。但我有一个要求,我需要使用命令提示符删除回收站内容。这可能吗?如果是这样,我该如何实现?

【问题讨论】:

我只是让 Windows 在回收站达到最大大小时自动删除最旧的文件superuser.com/questions/69284/… 有没有一种方法不需要额外的使用 admin cmd 提示符的步骤?只用我的帐号也没关系,我的电脑上只用一个帐号。 【参考方案1】:

您可以通过永久删除包含系统文件的驱动器上的回收站目录,从命令行有效地“清空”回收站。 (在大多数情况下,这将是 C: 驱动器,但您不应该对该值进行硬编码,因为它并不总是正确的。相反,请使用 %systemdrive% 环境变量。)

这种策略有效的原因是因为每个驱动器都有一个隐藏的、受保护的文件夹,名称为$Recycle.bin,回收站实际存储已删除文件和文件夹的位置。删除此目录后,Windows 会自动创建一个新目录。

因此,要删除目录,请使用带有/s 参数的rd 命令(r​emove d​ictory),这表明所有指定目录中的文件和目录也应删除:

rd /s %systemdrive%\$Recycle.bin

请注意,此操作将永久从所有用户帐户中删除当前在回收站中的所有文件和文件夹。此外,您将(显然)必须从提升的命令提示符运行该命令,以获得足够的权限来执行此操作。

【讨论】:

还有一些注意事项: 在您实际打开回收站和/或刷新桌面之前,垃圾箱状态的变化可能不会反映在资源管理器(桌面图标)中, 它只影响那个特定的音量;其他驱动器上的回收文件不会受到影响,因此您可能实际上并未使用此方法清空回收站,并且目录名称可能因 Windows 版本而异(以及我也相信文件系统)。它可能是$Recycle.binRecycledRecycler 等,如果您进行多重引导,您甚至可能拥有多个——像 Norton Recovery Bin 这样的程序有自己的目录。 @Synetech,我们如何确定是$Recycle.binRecycled 还是Recycler?是否有一个变量可以做到这一点,或者是通过捕获异常的唯一方法? 注意:如果您在脚本中使用它,您还需要传入/q 开关,因此rd 不会给您额外的提示。 rd /s /q %SYSTEMDRIVE%\$Recycle.bin 在我的 Windows 10 上不起作用。使用此命令后没有任何反应。 提醒这仅适用于 CMD。如果您希望它在 powershell 中运行,请尝试cmd /c "rd /s %systemdrive%\$Recycle.bin"【参考方案2】:

比起Frank P. Westlake,我更喜欢recycle.exe。它提供了一个很好的前后状态。 (我已经使用 Frank 的各种实用程序超过十年了..)

C:\> recycle.exe /E /F
Recycle Bin: ALL
    Recycle Bin C:  44 items, 42,613,970 bytes.
    Recycle Bin D:   0 items, 0 bytes.
            Total:  44 items, 42,613,970 bytes.

Emptying Recycle Bin: ALL
    Recycle Bin C:   0 items, 0 bytes.
    Recycle Bin D:   0 items, 0 bytes.
            Total:   0 items, 0 bytes.

它还有更多用途和选项(列出的输出来自 /?)。

Recycle all files and folders in C:\TEMP:
  RECYCLE C:\TEMP\*

List all DOC files which were recycled from any directory on the C: drive:
  RECYCLE /L C:\*.DOC

Restore all DOC files which were recycled from any directory on the C: drive:
  RECYCLE /U C:\*.DOC

Restore C:\temp\junk.txt to C:\docs\resume.txt:
  RECYCLE /U "C:\temp\junk.txt" "C:\docs\resume.txt"

Rename in place C:\etc\config.cfg to C:\archive\config.2007.cfg:
  RECYCLE /R "C:\etc\config.cfg" "C:\archive\config.2007.cfg"

【讨论】:

这不是和Synetech提到的一样的问题吗? ***.com/questions/9238953/… @Pacerier 我没有在桌面上显示回收站,所以我之前从未注意到图标是否更新。刚刚测试后,通过recycle.exe清空后图标is正确更新。就目录而言,我希望它使用 Win32 API 来清空回收站。话虽如此,我已经在 Windows 上使用这个工具很多年了,包括 XP、7、8、8.1 和 Server 2003、2012、2012 R2。 (我可能在 Vista 和 Server 2008 上使用过它,但运行这些操作系统的时间不长,所以我不能肯定..) 是的,它不是一个特别有用的工具,尤其是因为已经有内置的方法可以做到这一点。 @Pacerier 内置!?就像使用键盘和/或鼠标在 Windows 资源管理器中导航一样?使用桌面上的图标(假设回收站甚至显示在桌面上)?两者都不能解决操作员的问题。我确实认为某处有一个清空垃圾箱的命令,例如删除历史记录RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1,但我还没有找到它。所以,拜托,如果你有内置的方式,请分享! @Pacerier:首先你建议这个解决方案有像RD /S [/Q] 解决方案这样的缺陷——@wasatchwizard 通过测试驳斥了——然后完全相同的RD /S [/Q] 解决方案突然变得更好,因为它是“内置的”。这有什么意义? RD /S [/Q] 有@Synetech 描述的问题。这个解决方案没有。【参考方案3】:

nircmd 让您通过键入来做到这一点

nircmd.exe emptybin

http://www.nirsoft.net/utils/nircmd-x64.ziphttp://www.nirsoft.net/utils/nircmd.html

【讨论】:

谢谢,当我的回收站中有很多东西时,Windows 点击清空剂量不起作用,谢谢。 @shareef 谢谢你的评论 :)【参考方案4】:

您可以使用 powershell 脚本(这也适用于具有文件夹重定向的用户,并且不会让他们的回收站占用服务器存储空间)

$Shell = New-Object -ComObject Shell.Application
$RecBin = $Shell.Namespace(0xA)
$RecBin.Items() | %Remove-Item $_.Path -Recurse -Confirm:$false

以上脚本取自here。

如果您有 Windows 10 和 powershell 5,则有 Clear-RecycleBin commandlet。

要在 PowerShell 中使用 Clear-RecycleBin 而无需确认,您可以使用 Clear-RecycleBin -Force。官方文档可以找到here

【讨论】:

清除 RecycleBin 在 windows 10 的 PowerShell 中很有用 Clear-RecycleBin 成功删除了回收站中一些我无法删除的格式错误的文件夹名称。【参考方案5】:

要悄悄删除所有内容,请尝试:

rd /s /q %systemdrive%\$Recycle.bin

【讨论】:

【参考方案6】:

我知道我参加聚会有点晚了,但我想我可能会贡献我主观上更优雅的解决方案。

我正在寻找一个脚本,它可以通过 API 调用清空回收站,而不是粗暴地从文件系统中删除所有文件和文件夹。在尝试RecycleBinObject.InvokeVerb("Empty Recycle &Bin")(显然只适用于XP或更早版本)失败后,我偶然发现了使用编译语言中嵌入在shell32.dll中的函数SHEmptyRecycleBin()的讨论。我想,嘿,我可以在 PowerShell 中执行此操作并将其包装在批处理脚本混合中。

使用 .bat 扩展名保存它并运行它以清空您的回收站。使用/y 开关运行它以跳过确认。

<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://***.com/a/41195176/1683264

@echo off & setlocal

if /i "%~1"=="/y" goto empty

choice /n /m "Are you sure you want to empty the Recycle Bin? [y/n] "
if not errorlevel 2 goto empty
goto :EOF

:empty
powershell -noprofile "iex ($%~f0 | out-string)" && (
    echo Recycle Bin successfully emptied.
)
goto :EOF

: end batch / begin PowerShell chimera #>
Add-Type shell32 @'
    [DllImport("shell32.dll")]
    public static extern int SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath,
        int dwFlags);
'@ -Namespace System

$SHERB_NOCONFIRMATION = 0x1
$SHERB_NOPROGRESSUI = 0x2
$SHERB_NOSOUND = 0x4

$dwFlags = $SHERB_NOCONFIRMATION
$res = [shell32]::SHEmptyRecycleBin([IntPtr]::Zero, $null, $dwFlags)

if ($res)  "Error 0x0:x8: 1" -f $res,`
    (New-Object ComponentModel.Win32Exception($res)).Message 
exit $res

这是一个更复杂的版本,它在调用SHEmptyRecycleBin() 之前首先调用SHQueryRecycleBin() 来确定bin 是否已经为空。对于这个,我去掉了choice 确认和/y 开关。

<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://***.com/a/41195176/1683264

@echo off & setlocal
powershell -noprofile "iex ($%~f0 | out-string)"
goto :EOF

: end batch / begin PowerShell chimera #>
Add-Type @'

using System;
using System.Runtime.InteropServices;

namespace shell32 
    public struct SHQUERYRBINFO 
        public Int32 cbSize; public UInt64 i64Size; public UInt64 i64NumItems;
    ;

    public static class dll 
        [DllImport("shell32.dll")]
        public static extern int SHQueryRecycleBin(string pszRootPath,
            out SHQUERYRBINFO pSHQueryRBInfo);

        [DllImport("shell32.dll")]
        public static extern int SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath,
            int dwFlags);
    

'@

$rb = new-object shell32.SHQUERYRBINFO

# for Win 10 / PowerShell v5
try  $rb.cbSize = [Runtime.InteropServices.Marshal]::SizeOf($rb) 
# for Win 7 / PowerShell v2
catch  $rb.cbSize = [Runtime.InteropServices.Marshal]::SizeOf($rb.GetType()) 

[void][shell32.dll]::SHQueryRecycleBin($null, [ref]$rb)
"Current size of Recycle Bin: 0:N0 bytes" -f $rb.i64Size
"Recycle Bin contains 0:N0 item1." -f $rb.i64NumItems, ("s" * ($rb.i64NumItems -ne 1))

if (-not $rb.i64NumItems)  exit 0 

$dwFlags = @
    "SHERB_NOCONFIRMATION" = 0x1
    "SHERB_NOPROGRESSUI" = 0x2
    "SHERB_NOSOUND" = 0x4

$flags = $dwFlags.SHERB_NOCONFIRMATION
$res = [shell32.dll]::SHEmptyRecycleBin([IntPtr]::Zero, $null, $flags)

if ($res)  
    write-host -f yellow ("Error 0x0:x8: 1" -f $res,`
        (New-Object ComponentModel.Win32Exception($res)).Message)
 else 
    write-host "Recycle Bin successfully emptied." -f green

exit $res

【讨论】:

对批处理/powershell 嵌合体技术(+1)的非常好的改进。 iex-ing 是你的主意吗? (顺便说一句,可以使用 msbuild 内联任务将 C# 代码嵌入批处理文件中,而无需编译 exe) @npocmaka 谢谢!我想很多其他人都以这种方式使用过iex。我忘记了我在哪里找到$%~f0 相当于gc "%~f0"。是this cat 把我变成了out-string。您可以将在批处理脚本中嵌入 C# 的示例与 msbuild 链接吗?我的 Google-fu 今天很弱。 这里 - dostips.com/forum/… - 虽然您不能直接传递命令行参数 - 您需要使用稍后可以从 c# 部分提取的参数定义一个变量 在上面的例子中.net版本没有参数化。【参考方案7】:

我使用这个 powershell oneliner:

gci C:\`$recycle.bin -force | remove-item -recurse -force

也适用于不同于 C: 的驱动器

【讨论】:

【参考方案8】:

您可以使用此 PowerShell 命令。

Clear-RecycleBin -Force

注意:如果您想要确认提示,请移除 -Force 标志

【讨论】:

工作,给出错误:Clear-RecycleBin : The system cannot find the path specified At line:1 char:1 + Clear-RecycleBin -Force + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (RecycleBin:String) [Clear-RecycleBin], Win32Exception + FullyQualifiedErrorId : FailedToClearRecycleBin,Microsoft.PowerShell.Commands.ClearRecycleBinCommand【参考方案9】:

同时

rd /s /q %systemdrive%\$RECYCLE.BIN

将从系统驱动器中删除 $RECYCLE.BIN 文件夹,通常是 c:, 应该考虑从任何其他可用分区中删除它,因为在本地和外部驱动器的任何分区中都有一个隐藏的 $RECYCLE.BIN 文件夹(但不在可移动驱动器中,例如没有 $RECYCLE.BIN 文件夹的 USB 闪存驱动器)。 例如,我在 d: 中安装了一个程序,为了删除它移动到回收站的文件,我应该运行:

rd /s /q d:\$RECYCLE.BIN

更多信息请访问超级用户Empty recycling bin from command line

【讨论】:

Ahhhh 我一直在试图弄清楚为什么上面建议的命令不起作用。指定 f: for mine 使它工作。非常感谢! 【参考方案10】:

我在批处理文件中使用这些命令来清空回收站:

del /q /s %systemdrive%\$Recycle.bin\*
for /d %%x in (%systemdrive%\$Recycle.bin\*) do @rd /s /q "%%x"

【讨论】:

Win 10 没有 %systemdrive%\$Recycle.bin 目录 @Zimba 当然不是。这里的每个人都在编造听起来很酷的东西【参考方案11】:

是的,您可以使用以下代码制作批处理文件:

cd \Desktop

echo $Shell = New-Object -ComObject Shell.Application >>FILENAME.ps1
echo $RecBin = $Shell.Namespace(0xA) >>FILENAME.ps1
echo $RecBin.Items() ^| %%Remove-Item $_.Path -Recurse -Confirm:$false >>FILENAME.ps1


REM The actual lines being writen are right, exept for the last one, the actual thigs being writen are "$RecBin.Items() | %Remove-Item $_.Path -Recurse -Confirm:$false"   
But since | and % screw things up, i had to make some changes.

Powershell.exe -executionpolicy remotesigned -File  C:\Desktop\FILENAME.ps1

这基本上创建了一个 powershell 脚本,它清空 \Desktop 目录中的垃圾,然后运行它。

【讨论】:

【参考方案12】:

使用以下行创建 cmd 文件:

for %%p in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist "%%p:\$Recycle.Bin" rundll32.exe advpack.dll,DelNodeRunDLL32 "%%p:\$Recycle.Bin"

【讨论】:

Win 10 的驱动器根目录中没有 $Recycle.Bin 刚刚检查了 Windows 10 Pro build 2004 并且确实如此。也许您应该在文件管理器中启用显示隐藏/系统文件和文件夹的选项。 啊哈!找到它:命令仍然有效,但文件在资源管理器中不可见;我已经选择了Show Hidden files,并且在 C: 驱动器中不可见。当我取消选中Hide protected operating system files(单独选项)时,它确实变得可见。干杯。 rundll32.exe advpack.dll,DelNodeRunDLL32 没有为我清空 bin:Win 10.0.17134。固定:在提升提示符下工作。【参考方案13】:

我使用EmptyRecycleBin.pypython脚本

您需要pip install winshell

#!python3

# Empty Windows Recycle Bin

import winshell

try:
    winshell.recycle_bin().empty(confirm=False, show_progress=True, sound=False)
    print("Recycle Bin emptied")

except:
    print('Recycle Bin is already empty')

您可以更改布尔 False 和 True 语句以打开或关闭以下各项: 确认是\否对话框、进度条、音效。

如果你不使用 python,这个 powershell 的单行代码很棒。

我实际上在 EmptyRecycleBin.ps1 中有它,并在 Git Bash 中使用它。

Clear-RecycleBin -Force

【讨论】:

【参考方案14】:

所有的答案都太复杂了。 OP 向 CMD 请求了一种方法来执行此操作。

给你(来自 cmd 文件):

powershell.exe /c "$(New-Object -ComObject Shell.Application).NameSpace(0xA).Items() | %%Remove-Item $_.Path -Recurse -Confirm:$false"

是的,它会在资源管理器中更新。

【讨论】:

以上是关于如何通过命令提示符清空回收站?的主要内容,如果未能解决你的问题,请参考以下文章

怎么设置cmd命令提示符窗口界面语言为英文

为啥Linux的命令 rm 没有回收站呢?

为啥我的命令提示符界面只能输入中文而不能输入英文!十分感谢!

linux 垃圾箱是哪个文件??

如何通过命令提示符运行 DirectX 游戏

Ubuntu使用命令清空回收站