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

Windows 如何通过命令提示清空recyclebin?,windows,windows-7,command-line,batch-file,recycle-bin,Windows,Windows 7,Command Line,Batch File,Recycle Bin,通常我们通过鼠标右键单击回收站并选择“清空回收站”来删除回收站内容。但是我需要使用命令提示符删除回收站内容。这可能吗?如果是这样,我如何实现它?您可以通过永久删除包含系统文件的驱动器上的回收站目录,从命令行中有效地“清空”回收站。(在大多数情况下,这将是C:驱动器,但您不应该硬编码该值,因为它并不总是为真。相反,请使用%systemdrive%环境变量。) 这种策略之所以有效,是因为每个驱动器都有一个名为“$Recycle.bin”的隐藏的受保护文件夹,回收站在该文件夹中实际存储已删除的文件和文

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

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

这种策略之所以有效,是因为每个驱动器都有一个名为“
$Recycle.bin
”的隐藏的受保护文件夹,回收站在该文件夹中实际存储已删除的文件和文件夹。删除此目录时,Windows会自动创建一个新目录

因此,要删除目录,请使用
rd
命令(r​情绪​使用
/s
参数,该参数指示也应删除指定目录中的所有文件和目录:

rd /s %systemdrive%\$Recycle.bin

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

nircmd允许您通过键入

nircmd.exe emptybin


我更喜欢来自的
recycle.exe
。它提供了一个良好的前后状态。(我已经使用Frank的各种实用程序超过十年了……)

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


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

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

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

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

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


有关详细信息,请访问超级用户,网址为

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

上面的脚本取自

如果您使用的是windows 10和powershell 5,则存在以下问题


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

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

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

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

我正在寻找一个脚本,它可以通过API调用清空回收站,而不是从文件系统中粗略地删除所有文件和文件夹。在尝试
RecycleBinObject.InvokeVerb(“空回收站”)
(这显然只适用于XP或更早版本)失败后,我无意中讨论了如何使用从编译语言调用的shell32.dll中嵌入的函数。我想,嘿,我可以在PowerShell中实现这一点,并将其包装在批处理脚本混合中

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


添加类型shell32@'
[DllImport(“shell32.dll”)]
公共静态外部int-SHEmptyRecycleBin(IntPtr-hwnd,字符串pszRootPath,
int dwFlags);
'@-命名空间系统
$SHERB_NOCONFIRMATION=0x1
$SHERB_NOPROGRESSUI=0x2
$SHERB_NOSOUND=0x4
$dwFlags=$SHERB_NOCONFIRMATION
$res=[shell32]::SHEmptyRecycleBin([IntPtr]::Zero,$null,$dwFlags)
如果($res){“错误0x{0:x8}:{1}”-f$res`
(新对象组件model.Win32Exception($res)).Message}
退出$res

这里有一个更复杂的版本,它首先调用以确定在调用之前bin是否已经为空。对于这一个,我去掉了
选项
确认和
/y
开关


添加类型@'
使用制度;
使用System.Runtime.InteropServices;
命名空间shell32{
公共结构SHQUERYRBINFO{
public Int32 cbSize;public UInt64 i64Size;public UInt64 i64NumItems;
};
公共静态类dll{
[DllImport(“shell32.dll”)]
公共静态外部输入SqueryRecyclebin(字符串pszRootPath,
输出SHQUERYRBINFO pSHQueryRBInfo);
[DllImport(“shell32.dll”)]
公共静态外部int-SHEmptyRecycleBin(IntPtr-hwnd,字符串pszRootPath,
int dwFlags);
}
}
'@
$rb=新对象shell32.SHQUERYRBINFO
#适用于Win 10/PowerShell v5
请尝试{$rb.cbSize=[Runtime.InteropServices.Marshal]::SizeOf($rb)}
#适用于Win 7/PowerShell v2
catch{$rb.cbSize=[Runtime.InteropServices.Marshal]::SizeOf($rb.GetType())}
[void][shell32.dll]::SHQueryRecycleBin($null,[ref]$rb)
“回收站的当前大小:{0:N0}字节”-f$rb.i64Size
“回收站包含{0:N0}项{1}。”-f$rb.i64NumItems,(“s”*($rb.i64NumItems-ne 1))
如果(-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)
如果($res){
写入主机-f黄色(“错误0x{0:x8}:{1}”-f$res`
(新对象组件model.Win32Exception($res)).Message)
}否则{
写入主机“回收站已成功清空”-f绿色
}
退出$res

我使用此powershell oneliner:

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

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

是的,您可以使用
$Shell = New-Object -ComObject Shell.Application
$RecBin = $Shell.Namespace(0xA)
$RecBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}
del /q /s %systemdrive%\$Recycle.bin\*
for /d %%x in (%systemdrive%\$Recycle.bin\*) do @rd /s /q "%%x"
gci C:\`$recycle.bin -force | remove-item -recurse -force
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.exe /c "$(New-Object -ComObject Shell.Application).NameSpace(0xA).Items() | %%{Remove-Item $_.Path -Recurse -Confirm:$false"
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"
Clear-RecycleBin -Force
Clear-RecycleBin -Force