如何通过命令提示符清空recyclebin?

时间:2012-02-11 08:50:23

标签: windows windows-7 command-line batch-file recycle-bin

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

14 个答案:

答案 0 :(得分:83)

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

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

因此,要删除目录,请使用rd命令( r emove d irectory)和/s参数,表示还应删除指定目录中的所有文件和目录:

rd /s %systemdrive%\$Recycle.bin

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

答案 1 :(得分:25)

我更喜欢Frank P. Westlakerecycle.exe。它提供了一个很好的前后状态。 (我已经使用弗兰克的各种公用事业超过十年了。)

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"

答案 2 :(得分:14)

nircmd 可让您通过输入

来实现
nircmd.exe emptybin

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

答案 3 :(得分:8)

您可以使用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

要在未经确认的情况下使用Clear-RecycleBin内部人员PowerShell,您可以使用Clear-RecycleBin -Force。可以找到官方文档here

答案 4 :(得分:4)

,而

  

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

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

  

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

超级用户可在Empty recycling bin from command line

获取更多信息

答案 5 :(得分:4)

我知道我参加聚会的时间有点晚了,但我认为我可能会主动提出更优雅的解决方案。

我正在寻找一个可以通过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()来确定在调用SHEmptyRecycleBin()之前bin是否已经为空。对于这个,我摆脱了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

答案 6 :(得分:4)

我使用这个powershell oneliner:

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

适用于C:以外的其他驱动器

答案 7 :(得分:3)

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

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

答案 8 :(得分:3)

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

所有答案都太复杂了。 OP向CMD请求了一种方法。

在这里(来自cmd文件):

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

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

答案 11 :(得分: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"

答案 12 :(得分:0)

您可以使用此PowerShell命令。

Clear-RecycleBin -Force

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

答案 13 :(得分:0)

我使用 EmptyRecycleBin.py python 脚本

您需要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