Szukam sposobu na usunięcie wszystkich plików starszych niż 7 dni w pliku wsadowym. Przeszukałem Internet i znalazłem kilka przykładów z setkami wierszy kodu, a także inne, które wymagały instalacji dodatkowych narzędzi wiersza poleceń, aby wykonać to zadanie.
Podobne rzeczy można zrobić w BASH za pomocą zaledwie kilku linii kodu. Wydaje się, że dla plików wsadowych w systemie Windows można zrobić coś co najmniej zdalnie łatwego. Szukam rozwiązania, które działa w standardowym wierszu polecenia systemu Windows, bez żadnych dodatkowych narzędzi. Proszę nie PowerShell ani Cygwin.
Odpowiedzi:
Cieszyć się:
Więcej informacji znajduje się w
forfiles
dokumentacji .Więcej dodatków można znaleźć w Indeksie A wiersza poleceń systemu Windows XP .
Jeśli nie masz
forfiles
zainstalowanego na swoim komputerze, skopiuj go z dowolnego systemu Windows Server 2003 na swój komputer z systemem Windows XP pod adresem%WinDir%\system32\
. Jest to możliwe, ponieważ EXE jest w pełni kompatybilny między Windows Server 2003 i Windows XP.Późniejsze wersje systemu Windows i Windows Server mają domyślnie zainstalowane.
W systemie Windows 7 i nowszych (w tym Windows 10):
Składnia nieco się zmieniła. Dlatego zaktualizowane polecenie to:
źródło
Uruchom następujące polecenia :
Przenieś wszystkie pliki (używając / mov, który przenosi pliki, a następnie usuwa je, w przeciwieństwie do / move, który przenosi całe pliki, które są następnie usuwane) za pomocą robocopy w inne miejsce, a następnie wykonaj polecenie usuwania na tej ścieżce, a ty wszystko dobrze.
Również jeśli masz katalog z dużą ilością danych, możesz użyć
/mir
przełącznikaźródło
rd /s /q c:\destination
zamiastdel
polecenia, a nawet użyć innegorobocopy /mir c:\emptydir c:\destination
uruchomienia, aby opróżnić katalog, jeśli oczekujesz problemów z nazwami plików.forfiles
z przyjętej odpowiedzi nie da rady.C:\test
starszych niż 7 dni. Aby usunąć pliki, zmieńecho
nadel
:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
Ok trochę się nudziłem i wymyśliłem to, które zawiera moją wersję zamiennika epoki Linuksa biedaka, ograniczoną do codziennego użytku (bez zatrzymywania czasu):
7daysclean.cmd
STOSOWANIE
set /a strip=day*7
: Zmień 7 na liczbę dni do zachowania.set dSource=C:\temp
: To jest katalog początkowy do sprawdzania plików.UWAGI
To jest nieniszczący kod, wyświetli, co by się stało.
Zmiana :
do czegoś takiego:
więc pliki zostaną faktycznie usunięte
Luty : jest zakodowany na stałe do 28 dni. Bissextile lata to naprawdę piekło. jeśli ktoś ma pomysł, który nie dodałby 10 linii kodu, śmiało pisz dalej, więc dodaję go do mojego kodu.
epoka : Nie brałem pod uwagę czasu, ponieważ potrzeba jest usunięcia plików starszych niż określona data, zajęcie godzin / minut spowodowałoby usunięcie plików z dnia, który miał być zachowany.
OGRANICZENIE
epoka przyjmuje za pewnik, że twój krótki format daty to RRRR-MM-DD. Musiałby zostać dostosowany do innych ustawień lub oceny w czasie wykonywania (czytaj sShortTime, konfiguracja związana z użytkownikiem, skonfiguruj odpowiednią kolejność pól w filtrze i użyj filtru, aby wyodrębnić poprawne dane z argumentu).
Czy wspominałem, że nienawidzę automatycznego formatowania tego edytora? usuwa puste linie, a kopiowanie i wklejanie to piekło.
Mam nadzieję, że to pomoże.
źródło
7daysclean.cmd
brzmi jak niesamowite imię dla zespołu Synth-Punk.Powinieneś to zrobić
/d -3
(3 dni wcześniej) To działa dobrze dla mnie. Tak więc wszystkie skomplikowane partie mogą znajdować się w koszu. Równieżforfiles
nie obsługują ścieżek UNC, więc nawiązać połączenie sieciowe z napędzające.źródło
*.*
? Symbol wieloznaczny*.*
nie pasuje do wszystkich plików w systemie Windows. Pasuje tylko do plików z.
ich nazwami. OP nigdy nie powiedział nic o wymaganiu.
w nazwie pliku. Właściwym parametrem jest/M *
, ale i tak jest to ustawienie domyślne. W ogóle nie ma takiej potrzeby/M
.*.*
zachowuje się dokładnie tak, jak*
w systemie Windows. W rzeczywistości właśnie wypróbowałem go na swoim komputerze idir *.*
rzeczywiście wymieniłemtest file
plik bez rozszerzenia.*.*
jest niespójne między, powiedzmy,dir
a-m
opcjąforfiles
.-m *.*
Maska rzeczywiście pominąć bez rozszerzeń nazw plików, jak stwierdziłem w moim komentarzu powyżej (spróbować samemu). Zabawne jest to, że dokumentacja MS wyraźnie stwierdza, że-m *.*
jest to ustawienie domyślne. Jeśli jednak wypróbujesz to w prawdziwym życiu, zobaczysz, że domyślnie jest tak naprawdę-m *
- wszystkie pliki są iterowane.*.*
maska została zastosowana do wszystkich plików. Moje retoryczne pytanie dotyczące „tego dziwnego nawyku” było rzeczywiście nieuzasadnione, ponieważ traktowanie*.*
i*
równoważność jest od dawna konwencją Windows. Jednak/m
opcjaforfiles
z jakiegoś powodu narusza tę konwencję.Zobacz moją odpowiedź na podobne pytanie :
Spowoduje to usunięcie plików starszych niż podana data. Jestem pewien, że można go zmodyfikować, aby cofnął się o siedem dni od bieżącej daty.
aktualizacja: Zauważyłem, że HerbCSO ulepszyło powyższy skrypt. Zamiast tego zalecam użycie jego wersji .
źródło
Moje polecenie jest
@PATH
- w moim przypadku to po prostu ścieżka, więc musiałem użyć@PATH\@FILE
też
forfiles /?
dla mnie też nie działa, aleforfiles
(bez „?”) działało dobrze.I jedyne pytanie, jakie mam: jak dodać wiele masek (na przykład „ .log | .bak”)?
Wszystko to dotyczy pliku forfiles.exe, który pobrałem tutaj (na Win XP)
Ale jeśli używasz serwera Windows, plik forfiles.exe powinien już tam być i różni się od wersji ftp. Dlatego powinienem zmodyfikować polecenie.
W systemie Windows Server 2003 używam tego polecenia:
źródło
Bardzo często pojawiają się pytania dotyczące daty / godziny, które należy rozwiązać za pomocą pliku wsadowego. Ale interpreter cmd.exe wiersza poleceń nie ma funkcji do obliczania daty / godziny. Wiele dobrych działających rozwiązań korzystających z dodatkowych aplikacji konsolowych lub skryptów zostało już opublikowanych tutaj, na innych stronach Stack Overflow i na innych stronach internetowych.
Wspólne dla operacji opartych na dacie / godzinie jest wymóg konwersji ciągu daty / godziny na sekundy od określonego dnia. Bardzo często jest 1970-01-01 00:00:00 UTC. Ale każdy późniejszy dzień może być również wykorzystany w zależności od zakresu dat wymaganego do obsługi określonego zadania.
Jay opublikował 7daysclean.cmd zawierający szybkie rozwiązanie „data do sekund” dla interpretera cmd.exe z wiersza poleceń . Ale nie bierze się pod uwagę poprawnych lat przestępnych. JR opublikował dodatek uwzględniający dzień przestępny w bieżącym roku, ale ignoruje inne lata przestępne od roku bazowego, tj. Od 1970 r.
Używam od 20 lat tabel statycznych (tablic) utworzonych raz z małą funkcją C do szybkiego uzyskiwania liczby dni, w tym dni przestępnych od 1970-01-01 w funkcjach konwersji daty / godziny w moich aplikacjach napisanych w C / C ++.
Ta bardzo szybka metoda tabeli może być również używana w kodzie wsadowym za pomocą polecenia FOR . Postanowiłem więc zakodować podprogram partii,
GetSeconds
który oblicza liczbę sekund od 1970-01-01 00:00:00 UTC dla ciągu daty / godziny przekazanego do tej procedury.Uwaga: sekundy przestępne nie są brane pod uwagę, ponieważ systemy plików Windows również nie obsługują sekund przestępnych.
Po pierwsze, tabele:
Dni od 1970-01-01 00:00:00 UTC na każdy rok, w tym dni przestępne.
Obliczanie sekund dla roku 2039 do 2106 z epoką rozpoczynającą się 1970-01-01 jest możliwe tylko przy użyciu 32-bitowej zmiennej bez znaku, tj. Bez znaku długiej (lub bez znaku int) w C / C ++.
Ale cmd.exe używa dla wyrażeń matematycznych 32-bitowej zmiennej ze znakiem. Dlatego maksymalna wartość to 2147483647 (0x7FFFFFFF), czyli 2038-01-19 03:14:07.
Informacje o roku przestępnym (Nie / Tak) za lata 1970–2010.
Liczba dni do pierwszego dnia każdego miesiąca w bieżącym roku.
Konwersja daty na liczbę sekund od 1970-01-01 jest dość łatwa przy użyciu tych tabel.
Proszę o uwagę!
Format ciągów daty i godziny zależy od regionu i ustawień systemu Windows. Ograniczniki i kolejność żetonów przypisanych zmiennej środowiska
Day
,Month
iYear
najpierw za pętląGetSeconds
musi być dostosowana do lokalnego formatu daty / czasu w razie potrzeby.Konieczne jest dostosowanie ciągu daty zmiennej środowiskowej, jeśli format daty w zmiennej środowiskowej DATE różni się od formatu daty używanego przez polecenie FOR on
%%~tF
.Na przykład, gdy
%DATE%
rozwija się doSun 02/08/2015
while,%%~tF
rozwija się02/08/2015 07:38 PM
do kodu poniżej, można użyć z modyfikacją wiersza 4 do:Powoduje to przejście do podprogramu po prostu
02/08/2015
- ciąg daty bez 3 liter skrótu dnia tygodnia i znak odstępu.Alternatywnie można zastosować następujące informacje, aby przekazać aktualną datę w poprawnym formacie:
Teraz ostatnie 10 znaków z ciągu daty jest przekazywanych do funkcji,
GetSeconds
a zatem nie ma znaczenia, czy ciąg daty zmiennej środowiskowej DATE jest z, czy bez dnia tygodnia, o ile dzień i miesiąc są zawsze z 2 cyframi w oczekiwanej kolejności, tj. W formaciedd/mm/yyyy
lubdd.mm.yyyy
.Oto kod wsadowy z objaśnieniem komentarzy, które po prostu wypisują, który plik należy usunąć, a który przechowywać w
C:\Temp
drzewie folderów, patrz kod pierwszej pętli FOR .Dla optymalnej wydajności najlepiej byłoby usunąć wszystkie komentarze, tj. Wszystkie wiersze zaczynające się od rem po 0-4 wiodących spacji.
A tablice można również zmniejszyć, tj. Zmniejszając zakres czasu od 1980-01-01 00:00:00 do 2038-01-19 03:14:07, jak obecnie obsługuje powyższy kod partii, na przykład do 2015-01 -01 do 2019-12-31, ponieważ poniższy kod naprawdę usuwa pliki starsze niż 7 dni
C:\Temp
drzewie folderów.Ponadto poniższy kod partii jest zoptymalizowany do formatu 24-godzinnego.
Aby uzyskać więcej informacji na temat formatów daty i godziny oraz porównań czasu pliku w systemie Windows, zobacz moją odpowiedź na temat Sprawdź, czy plik jest starszy niż 4 godziny w pliku wsadowym, z dużą ilością dodatkowych informacji o czasach plików.
źródło
Skopiuj ten kod i zapisz go jako
DelOldFiles.vbs
.ZASTOSOWANIE W CMD:
cscript //nologo DelOldFiles.vbs 15
15 oznacza usuwanie plików starszych niż 15 dni wcześniej.
źródło
W systemie Windows Server 2008 R2:
Spowoduje to usunięcie wszystkich plików .sql starszych niż 90 dni.
źródło
Użyj forfiles.
Istnieją różne wersje. Wcześni używają parametrów stylu uniksowego.
Moja wersja (dla serwera 2000 - uwaga po spacji po przełącznikach) -
Aby dodać forfile do XP, pobierz exe z ftp://ftp.microsoft.com/ResKit/y2kfix/x86/
i dodaj go do C: \ WINDOWS \ system32
źródło
*.*
wforfiles
nie pasuje do wszystkich plików. Dopasowuje tylko pliki z.
ich nazwami (tj. Pliki z rozszerzeniami). OP nigdy nie powiedział nic o wymaganiu.
w nazwie pliku. Właściwym parametrem jest/M *
, ale i tak jest to ustawienie domyślne. W ogóle nie ma takiej potrzeby/M
.W przypadku systemu Windows 2012 R2 będą działać następujące czynności:
aby zobaczyć pliki, które zostaną usunięte, użyj tego
źródło
IMO, JavaScript stopniowo staje się uniwersalnym standardem skryptów: prawdopodobnie jest dostępny w większej liczbie produktów niż jakikolwiek inny język skryptowy (w Windows jest dostępny za pomocą Windows Scripting Host). Muszę wyczyścić stare pliki w wielu folderach, więc oto funkcja JavaScript, aby to zrobić:
Aby wyczyścić każdy folder, po prostu dodaj kolejne wywołanie do funkcji clearFolder (). Ten konkretny kod zachowuje również pliki exe i dll oraz czyści również podfoldery.
źródło
Co powiesz na tę modyfikację na 7daysclean.cmd aby uwzględnić rok przestępny?
Można to zrobić za pomocą mniej niż 10 linii kodowania!
Edytuj przez Mofi:
Powyższy warunek, do którego przyczynił się JR, ocenia się zawsze na false powodu niepoprawnej składni.
I
Month GEQ 2
jest również błędne, ponieważ dodanie 86400 sekund na jeden dzień musi być wykonane w roku przestępnym tylko za miesiące od marca do grudnia, ale nie za luty.Działającym kodem, który należy wziąć pod uwagę dzień przestępny - tylko w bieżącym roku - w pliku wsadowym 7daysclean.cmd opublikowanym przez Jay byłoby:
źródło
Czy mogę dodać pokorny wkład do tego i tak już cennego wątku. Zauważyłem, że inne rozwiązania mogą pozbyć się rzeczywistego tekstu błędu, ale ignorują% ERRORLEVEL%, który sygnalizuje błąd w mojej aplikacji. I słusznie chcę% ERRORLEVEL%, o ile nie jest to błąd „Nie znaleziono plików”.
Kilka przykładów:
Debugowanie i eliminowanie błędu w szczególności:
Użycie programu oneliner do zwrócenia błędu lub błędu ERRORLEVEL:
Użycie programu oneliner do utrzymania zerowej wartości ERRORLEVEL na zero dla sukcesu w kontekście pliku wsadowego pośród innego kodu (ver> nul resetuje ERRORLEVEL):
W przypadku zadania CmdExec agenta programu SQL Server wylądowałem na następujących tematach. Nie wiem, czy to błąd, ale CmdExec w kroku rozpoznaje tylko pierwszy wiersz kodu:
źródło
Boże, już wiele odpowiedzi. Prostą i wygodną trasą, którą znalazłem, było dwukrotne uruchomienie ROBOCOPY.EXE w jednej kolejności z jednej instrukcji wiersza poleceń systemu Windows za pomocą parametru & .
W tym przykładzie działa on przez wybranie wszystkich plików ( . ) Starszych niż 30 dni i przeniesienie ich do folderu docelowego. Drugie polecenie robi to samo ponownie z dodaniem PURGE polecenia co oznacza usunięcie plików w folderze docelowym, które nie istnieją w folderze źródłowym. Zasadniczo pierwsze polecenie PRZENIESIA pliki, a drugie USUWA, ponieważ nie są one już dostępne w folderze źródłowym po wywołaniu drugiego polecenia.
Zapoznaj się z dokumentacją ROBOCOPY i użyj przełącznika / L podczas testowania.
źródło
Jeśli masz zestaw zasobów XP, możesz użyć robocopy, aby przenieść wszystkie stare katalogi do jednego katalogu, a następnie użyj rmdir, aby usunąć tylko ten jeden:
źródło
Myślę, że odpowiedź e.James jest dobra, ponieważ działa z niezmodyfikowanymi wersjami systemu Windows już w systemie Windows 2000 SP4 (i być może wcześniej), ale wymagała zapisu do pliku zewnętrznego. Oto zmodyfikowana wersja, która nie tworzy zewnętrznego pliku tekstowego, zachowując zgodność:
Aby być prawdziwym w stosunku do pierwotnego pytania, oto skrypt, który wykonuje CAŁĄ matematykę, jeśli nazwiesz ją liczbą dni jako parametrem:
UWAGA: Powyższy kod uwzględnia lata przestępne, a także dokładną liczbę dni w każdym miesiącu. Jedynym maksimum jest łączna liczba dni, które upłynęły od 0/0/0 (po czym zwraca lata ujemne).
UWAGA: matematyka idzie tylko w jedną stronę; nie może poprawnie pobrać przyszłych dat z negatywnych danych wejściowych (spróbuje, ale prawdopodobnie minie ostatni dzień miesiąca).
źródło
Być może będziesz w stanie to zrobić. Możesz spojrzeć na to pytanie , na prostszy przykład. Złożoność przychodzi, gdy zaczynasz porównywać daty. Może być łatwo stwierdzić, czy data jest dłuższa, czy nie, ale istnieje wiele sytuacji, które należy rozważyć, jeśli naprawdę potrzebujesz uzyskać różnicę między dwiema datami.
Innymi słowy - nie próbuj tego wymyślać, chyba że naprawdę nie możesz użyć narzędzi innych firm.
źródło
to nie jest nic niesamowitego, ale musiałem dziś zrobić coś takiego i uruchomić go jako zaplanowane zadanie itp.
plik wsadowy, DelFilesOlderThanNDays.bat poniżej z przykładowym exec w / params:
źródło
Rozwijając odpowiedź aku, widzę wiele osób pytających o ścieżki UNC. Proste mapowanie ścieżki unc na literę dysku sprawi, że pliki forfile będą szczęśliwe. Mapowanie i usuwanie mapowania dysków można na przykład wykonać programowo w pliku wsadowym.
Spowoduje to usunięcie wszystkich plików z rozszerzeniem .gz, które są starsze niż 7 dni. Jeśli chcesz się upewnić, że Z: nie jest mapowany na nic innego przed użyciem, możesz zrobić coś prostego, jak
źródło
ROBOCOPY działa dla mnie świetnie. Pierwotnie sugerował mój Iman. Ale zamiast przenosić pliki / foldery do katalogu tymczasowego, a następnie usuwać zawartość folderu tymczasowego, przenieś pliki do kosza !!!
Oto kilka wierszy mojego pliku wsadowego kopii zapasowej, na przykład:
Czyści wszystko starsze niż 15 dni z mojego folderu „Temp” i 30 dni na wszystko w moim folderze kopii zapasowej AutoCAD. Używam zmiennych, ponieważ linia może być dość długa i mogę ich ponownie użyć w innych lokalizacjach. Musisz tylko znaleźć ścieżkę dos do kosza związanego z logowaniem.
To jest na moim komputerze roboczym i działa. Rozumiem, że niektórzy z was mogą mieć bardziej restrykcyjne prawa, ale i tak spróbujcie;) Wyszukaj w Google wyjaśnienia dotyczące parametrów ROBOCOPY.
Twoje zdrowie!
źródło
Mój skrypt do usuwania plików starszych niż określony rok:
źródło
Ten zrobił to dla mnie. Działa z datą i możesz odjąć żądaną kwotę w latach, aby cofnąć się w czasie:
/F
wcmd /c del @path /F
siłach plik specyficzny zostać usunięte w niektórych przypadkach plik może być tylko do odczytu.dateYear
jest rok zmienna i nie można zmienić odejmowania do własnych potrzebźródło