BATCH: Potrzebna pomoc przy skrypcie do kopii zapasowej

Witam,
Potrzebuję pomocy przy poskładaniu komend w jeden skrypt. Celem jest zrobienie skryptu który:

  1. Wylistuje wszystkie pliki z katalogu (rekursywnie)
  2. Obliczy sumę md5 dla aktualnie listowanego pliku
  3. Porówna nazwę wylistowanego pliku z nazwą w liście:
    3.1 Jeśli nie ma nazwy w pliku to > wpisz nazwę:sumę md5
    3.2 Jeśli jest i nazwa różni się sumą to usuń tę linię i wstaw nową (podmieniając md5)
  4. Zmieniony pik skompresuj i pozostaw w tej lokalizacji.

Poniżej kod który udało mi się uruchomić osobno, jednak nie umiem tego wszystkiego złączyć w jedno:

  1. Listuję pliki
    for /r D:\test %f in (*.*) do echo "%f"

  2. Obliczam sumy z plików rekursywnie
    for %i in (*.*) do fciv.exe %i >> lista_md5

  3. Wyświetlam pliki w liście (muszę je jeszcze jakoś porównać z tymi wylistowanymi)
    for /f "tokens=*" %i in (list.txt) DO (echo %i)

  4. Kompresja pliku:
    7za a -ttar E:\test\files.tar E:\test\* -r

W pliku *.cmd muszą być dwa procenty (%%):

set path=%path%;C:\fciv;C:\Program Files\7-Zip

for /r D:\test %%f in (*.*) do echo "%%f"
for %%i in (*.*) do fciv.exe %%i >> lista_md5
for /f "tokens=*" %%i in (list.txt) DO (echo %%i)
7z a -ttar E:\test\files.tar E:\test\* -r

chyba działa, jedynie sobie dodałem zmienną path i 7za zmieniłem na 7z (tyle, że u mnie nie ma w nim nic więcej poza kolejnymi dwoma archiwami tar i ostatnie jest puste albo archiwum nie powstaje).

Na krok 3.1, 3.2 nie mam pomysłu, dodatkowo jakieś śmieci do pliku wrzuca to narzędzie Microsoft.

//
// File Checksum Integrity Verifier version 2.05.
//

I takie coś w koło Macieju po każdej obliczonej sumie.

Może sumy z 7-zip w SHA1 będą lepsze: https://sevenzip.osdn.jp/chm/cmdline/commands/hash.htm on wrzuca jeszcze więcej informacji…

Dzięki za podpowiedź, zrobiłem kilka poprawek, ale jednak wydaje mi się że nie mogą być to komendy jedna pod drugą niezależne, bo przecież one muszą robić te 4 operacje na tym samym pliku, poźniej iść do kolejnego itd, więc powinny być jakoś zagnieżdzone.

set path=%path%;D:\test2\fciv;D:\test2\7za

for /r D:\test2\dir %%f in (*.*) do echo "%%f"
for %%i in (*.*) do fciv %%i >> list.txt
for /f "tokens=*" %%i in (list.txt) DO (echo %%i)
D:\test2\7z\7za a -ttar D:\test2\files.tar D:\test2\dir * -r
  1. Ten kod tworzy wpisy w list.txt ciągle dodając kolejne, nie sprawdza czy już taki jest
  2. Dopiero jeśli sprawdzi i nie ma powinien dopisać i spakować TYLKO ten plik.

Podzieliłem to na części i teraz utknąłem na tym:

set path=%path%;D:\test2\fciv;D:\test2\7za
cls

for /r D:\test2\dir %%f in (*.txt) do (
findstr /m "%%f" list.txt
if %%f=="list.txt" (
D:\test2\7z\7za a -ttar %%f.tar %%f -r
)
)

W teorii ten kod jeśli znajdzie nazwę pliku ze świeżką w liście to powinien wyświetlić nazwę pliku, i wtedy spakować, ale tego nei robi.
chyba problem jest z tym że ścieżka zawiera “/”.