通常,我们通过用鼠标右键单击回收站内容并选择“清空回收站”来删除回收站内容。但是我有一个要求,我需要使用命令提示符删除回收站中的内容。这可能吗?如果是这样,我该如何实现?
通常,我们通过用鼠标右键单击回收站内容并选择“清空回收站”来删除回收站内容。但是我有一个要求,我需要使用命令提示符删除回收站中的内容。这可能吗?如果是这样,我该如何实现?
Answers:
通过永久删除包含系统文件的驱动器上的回收站目录,可以从命令行有效地“清空”回收站。(在大多数情况下,这将是C:
驱动器,但是您不应该对该值进行硬编码,因为它不一定总是正确的。请使用%systemdrive%
环境变量。)
此策略起作用的原因是,每个驱动器都有一个名为的受保护的隐藏文件夹$Recycle.bin
,这是回收站实际存储已删除文件和文件夹的位置。删除此目录后,Windows会自动创建一个新目录。
因此,删除目录,使用rd
命令([R EMOVE d irectory)与/s
参数,这表明所有的指定目录中的文件和目录,应该也被删除:
rd /s %systemdrive%\$Recycle.bin
请注意,此操作将从所有用户帐户中永久删除当前在回收站中的所有文件和文件夹。此外,您(显然)将必须从提升权限的命令提示符下运行命令,以便具有足够的特权来执行此操作。
$Recycle.bin
,Recycled
,Recycler
等你甚至可以有不止一个,如果你像诺顿恢复斌多重引导的程序有自己的目录。
$Recycle.bin
,Recycled
或Recycler
?是否有一个变量可以做到这一点,或者是捕获异常的唯一方法?
/q
开关,因此rd
不会给您额外的提示。rd /s /q %SYSTEMDRIVE%\$Recycle.bin
cmd /c "rd /s %systemdrive%\$Recycle.bin"
我更喜欢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"
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1
但我没有找到它。所以,请,如果您有内置的方式,请分享!
RD /S [/Q]
解决方案的缺陷-@wasatchwizard被测试驳斥了-然后完全相同的RD /S [/Q]
解决方案突然变得更好,因为它是“内置”的。这有什么意义?RD /S [/Q]
@Synetech描述了问题。此解决方案没有。
nircmd允许您通过键入
nircmd.exe emptybin
http://www.nirsoft.net/utils/nircmd-x64.zip
http://www.nirsoft.net/utils/nircmd.html
您可以使用Powershell脚本(这也适用于具有文件夹重定向功能的用户,也可以使其回收站不占用服务器存储空间)
$Shell = New-Object -ComObject Shell.Application
$RecBin = $Shell.Namespace(0xA)
$RecBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}
上面的脚本是从这里获取的。
如果您有Windows 10和Powershell 5,则有Clear-RecycleBin
Commandlet。
要Clear-RecycleBin
在PowerShell内部使用而不进行确认,可以使用Clear-RecycleBin -Force
。官方文档可以在这里找到
Clear-RecycleBin
成功删除了回收站中某些格式错误的文件夹名称,否则无法删除。
要秘密删除所有内容,请尝试:
rd /s /q %systemdrive%\$Recycle.bin
我知道我参加聚会有点晚了,但是我想我可以在主观上提出更优雅的解决方案。
我一直在寻找一个脚本,该脚本将通过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
iex
-ing你的想法?(顺便说一句,可以使用msbuild内联任务将C#代码嵌入批处理文件中,而无需编译exe)
是的,您可以使用以下代码制作批处理文件:
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目录中的垃圾,然后运行它。