logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Skrypt *.bat do usuwania plików z folderów, zostawiający określoną liczbę najnowszych

KamilSzym 22 Sie 2017 16:29 6027 11
REKLAMA
  • #1 16656914
    KamilSzym
    Poziom 11  
    Posty: 24
    Ocena: 1
    Witam

    potrzebuję napisać skrypt (najlepiej *.bat wywoływany z harmonogramu zadań) który będzie kasował pliki z wielu katalogów jednocześnie ale w każdym z tych katalogów zostawi określoną liczbę najnowszych plików

    przykład:
    C:\pliki\baza1 10 plików (ostatnia modyfikacja najnowszego pliku lipiec 2017)
    C:\pliki\baza2 70 plików (ostatnia modyfikacja najnowszego pliku maj 2015)
    C:\pliki\baza3 7 plików (ostatnia modyfikacja najnowszego pliku czerwiec 2013)
    C:\pliki\baza4 15 plików (ostatnia modyfikacja najnowszego pliku sierpień 2017)

    po wykonaniu skryptu zostanie:

    C:\pliki\baza1 7 plików (ostatnia modyfikacja najnowszego pliku lipiec 2017)
    C:\pliki\baza2 7 plików (ostatnia modyfikacja najnowszego pliku maj 2015)
    C:\pliki\baza3 7 plików (ostatnia modyfikacja najnowszego pliku czerwiec 2013)
    C:\pliki\baza4 7 plików (ostatnia modyfikacja najnowszego pliku sierpień 2017)

    czyli nie rusza plików choćby one miały 10 lat jeżeli mieszczą się wśród 7 najnowszych w danym folderze.

    napisałem taki skrypt:

    
    forfiles /p "C:\pliki" /s /m *.* /c "cmd /c Del @path" /d -7 
    


    ale on usuwa pliki starsze niż 7 dni czyli po 7 dniach najpóźniej wyrzuci mi całą zawartość katalogu.

    pomoże ktoś?
  • REKLAMA
  • #2 16658263
    tomrom1985
    Poziom 30  
    Posty: 2167
    Pomógł: 133
    Ocena: 641
    Już zacząłem pisać i zanim wysłałem zobaczyłem, że mamy prawie identyczny kod.
    A czy nie możesz napisać 4 .bat, i każdy odwołuje się do innego folderu? Do każdego bat dodajesz parametr o ilości dni od utworzenia, czyli zamiast /d -7 np /d -30 czy /d -500 dla innego folderu.
  • REKLAMA
  • #3 16658366
    KamilSzym
    Poziom 11  
    Posty: 24
    Ocena: 1
    Są to foldery z kopiami baz danych klientów. Folderów jest ponad 300 i ta liczba rośnie - jest to program księgowy, bazy konkretnego klienta to osobny folder, część klientów już jest nie obsługiwana ale archiwa i kopie ich baz muszą zostać dla bezpieczeństwa.

    Tak jak pisałem w każdym z ponad 300 folderów musi zostać 7 najnowszych plików (niezależnie czy były utworzone dzień miesiąc czy 5 lat temu) reszta, czyli starsze, musi się automatycznie codziennie kasować.
  • #4 16659183
    clubs
    Poziom 38  
    Posty: 2219
    Pomógł: 629
    Ocena: 406
    Witam, forfiles do tego odpada, bo zawsze od daty systemowej będzie usuwał x dni,
    bat musi "wejść" w katalog, posegregować pliki np. od najnowszych do najstarszych (niezależnie kiedy one powstały jaką date mają) i wybrać z nich najstarsze a 7 najnowszych zostawić (tak to rozumiem).
    Jak wygląda ścieżka do tych katalogów? Zawsze jest to "C:\pliki\................" i w nim są te katalogi do sprawdzenia? Czy każdy katalog jest gdzieś indziej?
    Jaką nazwę mają? Tak jak wyżej baza1 do baza 300? Czy przypadkowe nazwy?
  • #5 16659215
    KamilSzym
    Poziom 11  
    Posty: 24
    Ocena: 1
    struktura jest następująca:

    c:\program\arch\0001\
    c:\program\arch\0002\
    c:\program\arch\0003\
    c:\program\arch\0004\
    ...
    c:\program\arch\0300\

    i w każdym katalogu pliki:
    daneRRRRMMDD_1.zip

    czasem się zdarza że w 1 dniu były wykonane 2 kopie bazy i jest:

    daneRRRRMMDD_2.zip i to było ważne aby zostało

    i czasem się zdarza daneRRRRMMDD_1.zip.XML zapisana jest w nim tylko suma kontrolna pliku kopii więc nie jest on aż tak istotny.
  • Pomocny post
    #6 16660091
    morfi717
    Poziom 9  
    Posty: 30
    Pomógł: 2
    Ocena: 10
    A powershell może być? Powershell jest w każdym systemie windows od WinXP, więc zakładam, że też go masz.
    Testowane na PS v2.0, więc będzie działać na Win7/Server 2008 i starszych (win XP miał PS v1.0).

    W Task Schedulerze podajesz jako program Powershell.exe i jako parametry -NoLogo -NonInteractive -executionpolicy bypass -File __plik__

    Do podmianki masz ew. dwie zmienne w kodzie poniżej. Jak coś pójdzie nie tak, błąd odłoży się w pliku error_log.txt w folderze głównym (np c:\pliki)

    Skrypt *.bat do usuwania plików z folderów, zostawiający określoną liczbę najnowszych

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Jeżeli interesuje cie wyrzucanie tylko plików *.zip to zamień
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod

    na
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 16660493
    KamilSzym
    Poziom 11  
    Posty: 24
    Ocena: 1
    Będę testował popołudniu, jasne ze PowerShell wchodzi w grę, serwer działa na Win Serv 2012 st r2

    Dodano po 4 [godziny] 35 [minuty]:

    Świetna robota, dzięki bardzo, wszystko działa idealnie ;)
  • REKLAMA
  • #8 16661604
    clubs
    Poziom 38  
    Posty: 2219
    Pomógł: 629
    Ocena: 406
    Witam

    To jeszcze w bacie :D
    Kod: Dos
    Zaloguj się, aby zobaczyć kod
  • #9 16661722
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    @clubs To parada!
  • #10 16661869
    KamilSzym
    Poziom 11  
    Posty: 24
    Ocena: 1
    w PS wszytko działa jak należy więc nie będę już bat'a testował ;) może przyda się innym ;) ale DZIĘKI
  • #11 21255290
    ubek1
    Poziom 11  
    Posty: 6
    Ocena: 3
    Cześć,
    @clubs
    Wpis trochę stary, ale skoro mi pomógł to coś dodam od siebie (koniecznie chciałem mieć to w CMD a nie PS):
    w pierwszym for po %sciezka% zbędny jest zapis: \* (a nawet błędny, chyba że ma przeszukiwać podkatalogi (tylko podkatalogi))
    W drugiej linii po poleceniu del mamy %%a - jest ok, ale omija pliki ze spacjami z nazwie, wpis "%%a" rozwiązuje ten problem.
    Ostatecznie, jeżeli chcemy osiągnąć efekt w którym w podanym katalogu zostanie pozostawione tylko 7 najnowszych plików, zapis może wyglądać tak:
    
    set sciezka="C:\katalogArch"
    for /d %%i in (%sciezka%) do (
    for /f "skip=7 delims=" %%a in ('dir %%i /b /s /o-d') do del "%%a")
    
  • #12 21256697
    clubs
    Poziom 38  
    Posty: 2219
    Pomógł: 629
    Ocena: 406
    ubek1 napisał:
    @clubs
    Wpis trochę stary, ale skoro mi pomógł to coś dodam od siebie
    w pierwszym for po %sciezka% zbędny jest zapis: \* (a nawet błędny, chyba że ma przeszukiwać podkatalogi (tylko podkatalogi))

    Właśnie nie, jakbyś przeczytał temat to byś wiedział, że (%sciezka%\*) tak musi być, bo główny katalog jest to "c:\program\arch" a w nim są podkatalogi i właśnie ta pierwsza pętla je "wyciąga", gdzie zmienna "i" "podkłada" z pełną ścieżka dla dira.
    Temat spacji nie był omawiany dla tego nie zamknąłem zmiennej "a" w "".
    ubek1 napisał:
    Ostatecznie, jeżeli chcemy osiągnąć efekt w którym w podanym katalogu zostanie pozostawione tylko 7 najnowszych plików, zapis może wyglądać tak:

    Nie koniecznie, bo jeżeli masz tylko jeden katalog a w nim pliki "C:\katalogArch" to nie potrzeba jest ci pierwsza pętla i można ją pominąć.
    Kod: Dos
    Zaloguj się, aby zobaczyć kod

    @ubek1
    Na przyszłość, nie odkopuj i nie podpinaj się pod tematy tylko załóż nowy.

Podsumowanie tematu

✨ Użytkownik poszukiwał skryptu *.bat, który automatycznie usuwałby pliki z wielu katalogów, pozostawiając jedynie 7 najnowszych plików w każdym z nich. W odpowiedziach zasugerowano różne podejścia, w tym użycie PowerShell, który okazał się skuteczny. Użytkownik potwierdził, że skrypt w PowerShell działa poprawnie na serwerze Windows Server 2012. Wskazano również na możliwość użycia prostego skryptu w CMD, który wykorzystuje pętle do przeszukiwania katalogów i usuwania starszych plików. W dyskusji podkreślono znaczenie zachowania plików niezależnie od daty ich utworzenia, a także omówiono strukturę katalogów i nazwy plików.
Wygenerowane przez model językowy.
REKLAMA