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


80

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


2
我只是让Windows会自动删除最早的文件时,回收站达到其最大尺寸superuser.com/questions/69284/...
马修锁定

有没有一种方法不需要使用admin cmd提示符的额外步骤?如果仅使用我的帐户就可以,我在PC上仅使用一个帐户就可以了。
user742864

Answers:


91

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

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

因此,删除目录,使用rd命令([R EMOVE d irectory)与/s参数,这表明所有的指定目录中的文件和目录,应该也被删除:

rd /s %systemdrive%\$Recycle.bin

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


17
还有一些警告:在您实际打开回收站和/或刷新桌面之前,bin状态的更改可能不会反映在资源管理器(桌面图标)中;仅影响该特定卷;其他驱动器上的回收文件将不会受到影响,因此您实际上可能不会使用此方法清空回收站,并且目录名称可能因Windows版本而异(并且我相信文件系统也是如此)。它可能是$Recycle.binRecycledRecycler等你甚至可以有不止一个,如果你像诺顿恢复斌多重引导的程序有自己的目录。
Synetech

1
@Synetech,我们如何找出是$Recycle.binRecycledRecycler?是否有一个变量可以做到这一点,或者是捕获异常的唯一方法?
Pacerier

3
注意:如果您在脚本中使用此命令,则还需要传递一个/q开关,因此rd不会给您额外的提示。rd /s /q %SYSTEMDRIVE%\$Recycle.bin
James Ko

在我的Windows 10上不起作用。使用此命令后无任何反应。
jdhao

1
请注意,这仅适用于CMD。如果您希望它在cmd /c "rd /s %systemdrive%\$Recycle.bin"
Powershell中

28

我更喜欢recycle.exe弗兰克·P.西湖。它提供了很好的前后状态。(我使用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提到的相同问题吗?stackoverflow.com/questions/9238953/...
Pacerier

1
@Pacerier我没有在桌面上显示回收站,因此我从未注意到图标是否更新。刚测试后,通过recycle.exe清空后,图标正确更新。就目录而言,我希望它使用Win32 API清空回收站。话虽如此,我已经在Windows上使用了该工具多年,包括XP,7、8、8.1和Server 2003、2012、2012 R2。(我可能在Vista和Server 2008上使用了它,但是没有长时间运行这些操作系统,所以不能肯定地说。)
kodybrown 2015年

1
是的,它不是一个特别有用的工具,尤其是因为已经有内置的方法来执行此操作。
Pacerier,2015年

2
@Pacerier内置方式!?像使用键盘和/或鼠标浏览Windows资源管理器一样?使用桌面上的图标(假设回收站甚至显示在桌面上)?两者都无法解决操作员的问题。我确实确实认为某处有一个命令可以清空垃圾箱,例如删除历史记录,RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1但我没有找到它。所以,请,如果您有内置的方式,请分享!
kodybrown,2015年

1
@Pacerier:首先,您建议此解决方案具有类似该RD /S [/Q]解决方案的缺陷-@wasatchwizard被测试驳斥了-然后完全相同的RD /S [/Q]解决方案突然变得更好,因为它是“内置”的。这有什么意义?RD /S [/Q]@Synetech描述了问题。此解决方案没有。
zb226 '16


11

您可以使用Powershell脚本(这也适用于具有文件夹重定向功能的用户,也可以使其回收站不占用服务器存储空间)

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

上面的脚本是从这里获取的

如果您有Windows 10和Powershell 5,则有Clear-RecycleBinCommandlet

Clear-RecycleBin在PowerShell内部使用而不进行确认,可以使用Clear-RecycleBin -Force。官方文档可以在这里找到


3
清除RECYCLEBIN是有用的PowerShell中在Windows 10

Clear-RecycleBin成功删除了回收站中某些格式错误的文件夹名称,否则无法删除。
S.TarıkÇetin


5

我知道我参加聚会有点晚了,但是我想我可以在主观上提出更优雅的解决方案。

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

将其保存为.bat扩展名,然后运行以清空回收站。用/y开关运行它以跳过确认。

<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://stackoverflow.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 0x{0:x8}: {1}" -f $res,`
    (New-Object ComponentModel.Win32Exception($res)).Message }
exit $res

这是一个更复杂的版本,它首先被调用SHQueryRecycleBin()以确定在调用之前bin是否已经为空SHEmptyRecycleBin()。对于这个,我摆脱了choice确认和/y切换。

<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://stackoverflow.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} item{1}." -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 0x{0: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

@npocmaka谢谢!我认为许多其他人已经使用iex这种方式。我忘记了我在哪里捡到那${%~f0}等于gc "%~f0"。正是这只猫把我吸引了out-string。您可以使用msbuild链接在批处理脚本中嵌入C#的示例吗?我的Google-fu今天很虚弱。
rojo

1
此处-dostips.com/forum/…-尽管您不能直接传递命令行参数-您需要定义一个变量,其参数以后可以从c#部分中提取
npocmaka

在上面的示例中,.net版本未参数化。
npocmaka

4

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

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

rd / s /qd:\$RECYCLE.BIN

从命令行清空回收站的超级用户处获得更多信息


我一直在试图弄清楚为什么上面建议的命令不起作用。为我指定f:使它起作用。非常感谢!<3
Phill

4

我使用此powershell oneliner:

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

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


3

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

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

2

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

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目录中的垃圾,然后运行它。


0

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

您可以从cmd文件开始:

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

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


0

使用以下命令创建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"

0

您可以使用此PowerShell命令。

Clear-RecycleBin -Force

注意:如果需要确认提示,请删除-Force标志

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.