Зазвичай ми видаляємо вміст кошика, клацнувши правою кнопкою миші та вибираючи «Очистити кошик». Але у мене є вимога, коли мені потрібно видалити вміст кошика за допомогою командного рядка. Чи можливо це? Якщо так, то як я можу цього досягти?
Зазвичай ми видаляємо вміст кошика, клацнувши правою кнопкою миші та вибираючи «Очистити кошик». Але у мене є вимога, коли мені потрібно видалити вміст кошика за допомогою командного рядка. Чи можливо це? Якщо так, то як я можу цього досягти?
Відповіді:
Ви можете ефективно "спорожнити" Кошик із командного рядка, остаточно видаливши каталог Корзини на диску, що містить системні файли. (У більшості випадків це буде C:
диск, але не слід жорстко кодувати це значення, оскільки воно не завжди буде істинним. Натомість використовуйте%systemdrive%
змінну середовища.)
Причина, по якій ця тактика працює, полягає в тому, що кожен диск має приховану, захищену папку з іменем $Recycle.bin
, де насправді Кошик зберігає видалені файли та папки. Коли цей каталог видаляється, Windows автоматично створює новий каталог.
Таким чином, щоб видалити каталог, використовуйте rd
команду ( г аліть д irectory) з /s
параметром, який вказує , що всі файли і директорії в межах зазначеної директорії повинні бути видалені , а також:
rd /s %systemdrive%\$Recycle.bin
Зверніть увагу, що ця дія назавжди видалить усі файли та папки, що перебувають у кошику, із усіх облікових записів користувачів . Крім того, вам (очевидно) доведеться запустити команду з підвищеного командного рядка, щоб мати достатні привілеї для виконання цієї дії.
$Recycle.bin
, Recycled
, Recycler
і т.д. , і ви , можливо , навіть більше , ніж один , якщо ви мульти-завантаження-програма , як Norton Recovery Bin має свої власні каталоги.
$Recycle.bin
, Recycled
або Recycler
? Чи існує така змінна змінної, чи це єдиний спосіб вловлювання винятків?
/q
комутатор, щоб rd
не отримувати додаткових запитів. rd /s /q %SYSTEMDRIVE%\$Recycle.bin
cmd /c "rd /s %systemdrive%\$Recycle.bin"
Я вважаю за краще recycle.exe
від Frank P. Westlake . Він забезпечує приємний статус до і після. (Я користуюся різними утилітами Франка вже більше десяти років ..)
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}
Наведений вище сценарій взято звідси .
Якщо у вас є вікна 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 або старіших версіях), я випадково натрапив на обговорення використання функції, вбудованої в shell32.dll під назвоюSHEmptyRecycleBin()
зі скомпільованої мови. Я подумав, привіт, я можу зробити це в 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()
. Для цього я позбувся 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
ваша ідея? (до речі, можна вбудувати код C # у командний файл із вбудованими завданнями
iex
цей спосіб. Я забуваю, де я взяв, що ${%~f0}
еквівалентно gc "%~f0"
. Саме на цього кота мене перетворили out-string
. Чи можете ви зв'язати приклад вбудовування C # у пакетний сценарій з msbuild? Мій Google-fu сьогодні слабкий.
поки
rd / s / q% systemdrive% \ $ RECYCLE.BIN
видалить папку $ RECYCLE.BIN із системного диска, як правило, це c:, слід подумати про її видалення з будь-яких інших доступних розділів, оскільки прихована папка $ RECYCLE.BIN є в будь-якому розділі на локальних та зовнішніх дисках (але не в знімні диски, такі як флеш-накопичувач USB, у якому немає папки $ RECYCLE.BIN). Наприклад, я встановив програму в d :, щоб видалити файли, які вона перемістила в кошик, мені слід запустити:
rd / s /qd:\$RECYCLE.BIN
Додаткову інформацію можна отримати в Super User у порожньому кошику для переробки з командного рядка
Так, ви можете створити пакетний файл із таким кодом:
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, а потім запускає його.
Усі відповіді занадто складні. OP запитував спосіб зробити це у CMD.
Ось (із файлу cmd):
powershell.exe /c "$(New-Object -ComObject Shell.Application).NameSpace(0xA).Items() | %%{Remove-Item $_.Path -Recurse -Confirm:$false"
І так, він оновиться у провіднику.