Polecenie MS-DOS, aby usunąć wszystkie pliki oprócz jednego


25

Czy istnieje polecenie MS-DOS, które pozwala mi usunąć wszystkie pliki oprócz jednego?

Jako przykład rozważ następujące pliki:

a.001  
a.002  
a.003  
a.exe  
a.c  

Czy istnieje polecenie usunięcia wszystkich plików oprócz a.c?

Odpowiedzi:


36

Aby to zrobić, możesz użyć poleceń fori if:

for %i in (*) do if not "%~i" == a.c del "%~i"

Przechodzi przez bieżący katalog i porównuje każdą nazwę pliku z ac. Jeśli nie pasuje, plik jest usuwany.


+1 nigdy nie pomyślałbym o użyciu tego do prostego usunięcia ... Mnóstwo dobrych odpowiedzi tutaj!
William Hilsum

4
@Wil, kiedy zaczniesz forregularnie używać, wymyślisz dla niego wszelkiego rodzaju szalone scenariusze. :)
Kevin

4
@ Mike, potrzebujesz czegoś takiego jak "dla% i w (A: \ Some \ Path \ *), jeśli nie%% nxi == ac del% i" Pamiętaj, że ścieżka kończy się na *, aby uzyskać pliki w tym folderze oraz, że porównanie dotyczy% ~ nxi, nazwy bez ścieżki. W przypadku takich destrukcyjnych pętli dobrym pomysłem jest wykonanie polecenia „dla ... wykonaj echo% i”, aby sprawdzić, jakie pliki zostaną zmienione przed uruchomieniem polecenia „for… zrób jeśli ... del% i”.
Kevin

1
Lepsze wykorzystaniedel "%i"
Mugen,

1
Jeśli potrzebujesz, aby IFinstrukcja nie uwzględniała wielkości liter, zmień ją na IF /I.
jep

16

Możesz ustawić plik do odczytu tylko przed usunięciem wszystkiego

attrib +r a.c
del *.*
attrib -r a.c

10

Nie, nie ma. Zrobiłbym katalog, skopiowałem do niego ważny plik, skasowałem . i przenieś plik z powrotem. Następnie usuń plik tymczasowy.

mkdir temp
move a.c temp
erase *.*
move temp\* .
rmdir temp

1
+1 surowy i technicznie @Feiht złodziej mówi, że jest lepszy sposób na zrobienie tego (więc dałem +1 tam), ale dla szybkości, właśnie tak bym to zrobił.
William Hilsum

3
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f

1
jakie są korzyści []?
barlop

1
@barlop: %fmoże mieć spacje w nazwie pliku.
paradroid

@paradroid nie, to nie pomoże, jeśli [4 r] == [4 r] echo równe Widziałem podobne zrobione przez niektórych, jak z. zamiast []. Mogę zgadywać, dlaczego, ale wolę usłyszeć od kogoś, kto to robi.
barlop,

@barlop: Nie mam pojęcia, co tam właśnie wpisałeś, ale nawiasy kwadratowe działają tak, jak działałyby cudzysłowy.
paradroid

@paradroid C: \> if [4 r] == [4 r] echo abc <ENTER> daje wynik „r] == [4 w tym czasie był nieoczekiwany”. Natomiast C: \> jeśli „4 r” == „4 r” echo abc daje wynik abc. Co więc sprawia, że ​​myślisz, że w jakikolwiek sposób działają one tak, jak znaki cudzysłowu? Nawet C: \> jeśli [ab] == [ab] echo abc <- nie działa daje podobny błąd. b] == [a było w tym czasie nieoczekiwane. Co sprawia, że ​​myślisz, że działają jak cytaty?
barlop,

1
FOR /F "tokens=1-4" %%a in ('dir /a:-d /b /s %app_path%^|find /v "%file%"') DO Del /q %%a %%b %%c %%d

Myślę, że byłoby to prawdopodobnie pomocne, gdyby wyjaśniono, co robi. Wygląda na to, że przegląda całe drzewo folderów, czego chcę. %app_path%i %file%są katalogiem głównym drzewa, które należy przechodzić, oraz plikiem, aby odpowiednio uniknąć usuwania. Co to jest ^i dlaczego przekazujemy cztery tokeny na plik do Delpolecenia?
LarsH

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.