Zwykle usuwamy zawartość kosza, klikając go prawym przyciskiem myszy i wybierając opcję „Opróżnij kosz”. Ale mam wymaganie, w którym muszę usunąć zawartość kosza za pomocą wiersza polecenia. czy to możliwe? Jeśli tak, jak mogę to osiągnąć?
Zwykle usuwamy zawartość kosza, klikając go prawym przyciskiem myszy i wybierając opcję „Opróżnij kosz”. Ale mam wymaganie, w którym muszę usunąć zawartość kosza za pomocą wiersza polecenia. czy to możliwe? Jeśli tak, jak mogę to osiągnąć?
Odpowiedzi:
Możesz skutecznie „opróżnić” Kosz z wiersza poleceń, trwale usuwając katalog Kosza na dysku zawierającym pliki systemowe. (W większości przypadków będzie to C:
dysk, ale nie należy zakodować tej wartości na stałe, ponieważ nie zawsze będzie to prawda. Zamiast tego użyj %systemdrive%
zmiennej środowiskowej).
Powodem, dla którego ta taktyka działa, jest to, że każdy dysk ma ukryty, chroniony folder o nazwie $Recycle.bin
, w którym Kosz faktycznie przechowuje usunięte pliki i foldery. Po usunięciu tego katalogu system Windows automatycznie tworzy nowy katalog.
Aby więc usunąć katalog, użyj rd
polecenia ( r emove d irectory) z /s
parametrem, który wskazuje, że wszystkie pliki i katalogi w określonym katalogu również powinny zostać usunięte:
rd /s %systemdrive%\$Recycle.bin
Zwróć uwagę, że ta czynność spowoduje trwałe usunięcie wszystkich plików i folderów znajdujących się obecnie w Koszu ze wszystkich kont użytkowników . Ponadto (oczywiście) będziesz musiał uruchomić polecenie z wiersza polecenia z podwyższonym poziomem uprawnień, aby mieć wystarczające uprawnienia do wykonania tej czynności.
$Recycle.bin
, Recycled
, Recycler
, itd., A może nawet więcej niż jeden, jeśli multi-boot-programy takie jak Norton Recovery Bin mają własne katalogi.
$Recycle.bin
, Recycled
albo Recycler
? Czy istnieje zmienna, która to robi, czy jest to jedyny sposób na wyłapywanie wyjątków?
/q
przełącznik, więc rd
nie wyświetla dodatkowego monitu. rd /s /q %SYSTEMDRIVE%\$Recycle.bin
cmd /c "rd /s %systemdrive%\$Recycle.bin"
Wolę recycle.exe
od Franka P. Westlake'a . Zapewnia dobry stan przed i po. (Używam różnych narzędzi Franka od ponad dziesięciu lat ...)
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.
Ma również wiele innych zastosowań i opcji (wymienione dane wyjściowe pochodzą z /?).
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
ale go nie znalazłem. Więc proszę, jeśli masz wbudowany sposób, udostępnij go!
RD /S [/Q]
rozwiązanie - które @wasatchwizard obalił testując - potem dokładnie to samo RD /S [/Q]
rozwiązanie nagle staje się lepsze, ponieważ jest „wbudowane”. W jaki sposób to ma sens? RD /S [/Q]
ma problemy opisane przez @Synetech. To rozwiązanie nie.
nircmd pozwala to zrobić, wpisując
nircmd.exe emptybin
http://www.nirsoft.net/utils/nircmd-x64.zip
http://www.nirsoft.net/utils/nircmd.html
Możesz użyć skryptu PowerShell (działa to również w przypadku użytkowników z przekierowaniem folderu, aby ich kosze na śmieci nie zajmowały miejsca na serwerze)
$Shell = New-Object -ComObject Shell.Application
$RecBin = $Shell.Namespace(0xA)
$RecBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}
Powyższy skrypt pochodzi z tego miejsca .
Jeśli masz Windows 10 i PowerShell 5, jest Clear-RecycleBin
Commandlet .
Aby używać Clear-RecycleBin
wewnątrz programu PowerShell bez potwierdzenia, możesz użyć Clear-RecycleBin -Force
. Oficjalną dokumentację można znaleźć tutaj
Clear-RecycleBin
pomyślnie usunąłem niektóre źle sformułowane nazwy folderów z kosza, których nie mogłem usunąć w inny sposób.
Aby potajemnie usunąć wszystko, spróbuj:
rd /s /q %systemdrive%\$Recycle.bin
Wiem, że trochę się spóźniłem na przyjęcie, ale pomyślałem, że mogę wnieść swój subiektywnie bardziej wdzięczne rozwiązanie.
Szukałem skryptu, który opróżniłby Kosz za pomocą wywołania API, zamiast brutalnie usuwać wszystkie pliki i foldery z systemu plików. Po niepowodzeniu w moich próbach RecycleBinObject.InvokeVerb("Empty Recycle &Bin")
(które najwyraźniej działają tylko w XP lub starszych), natknąłem się na dyskusje o użyciu funkcji osadzonej w shell32.dll wywołanej SHEmptyRecycleBin()
z języka kompilowanego. Pomyślałem, hej, mogę to zrobić w PowerShell i owinąć to w hybrydę skryptów wsadowych.
Zapisz to z rozszerzeniem .bat i uruchom, aby opróżnić Kosz. Uruchom go /y
przełącznikiem, aby pominąć potwierdzenie.
<# : 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
Oto bardziej złożona wersja, która najpierw wywołuje, SHQueryRecycleBin()
aby określić, czy pojemnik jest już pusty przed wywołaniem SHEmptyRecycleBin()
. W tym przypadku pozbyłem się choice
potwierdzenia i /y
przełącznika.
<# : 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 to twój pomysł? (btw jest to możliwe do osadzenia kodu C # w pliku wsadowego z zadań msbuild inline bez konieczności sporządzania EXE)
podczas
rd / s / q% systemdrive% \ $ RECYCLE.BIN
usunie folder $ RECYCLE.BIN z dysku systemowego, którym zwykle jest c :, należy rozważyć usunięcie go z innych dostępnych partycji, ponieważ na każdej partycji na dyskach lokalnych i zewnętrznych (ale nie na dyski wymienne, takie jak pendrive'y, które nie mają folderu $ RECYCLE.BIN). Na przykład zainstalowałem program w d :, aby usunąć pliki, które przeniósł się do Kosza, powinienem uruchomić:
rd / s /qd:\$RECYCLE.BIN
Więcej informacji można znaleźć w Super User pod adresem Empty recycling bin z wiersza poleceń
Tak, możesz utworzyć plik wsadowy za pomocą następującego kodu:
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
Zasadniczo tworzy to skrypt PowerShell, który opróżnia kosz w katalogu \ Desktop, a następnie go uruchamia.
Wszystkie odpowiedzi są zbyt skomplikowane. OP poprosił CMD o możliwość zrobienia tego.
Proszę bardzo (z pliku cmd):
powershell.exe /c "$(New-Object -ComObject Shell.Application).NameSpace(0xA).Items() | %%{Remove-Item $_.Path -Recurse -Confirm:$false"
I tak, zaktualizuje się w eksploratorze.