Mam wiele plików z json
rozszerzeniem w katalogu. Są one używane do generowania niektórych innych plików, ale powinno to nastąpić tylko wtedy, gdy json
pliki się zmieniły.
Do tej pory mam następujący skąpy skrypt:
for %%f in (*.json) do (
echo %%f
certutil -hashfile %%f SHA256 >> HASH.txt
)
Przeglądam wszystkie json
pliki, generuję wartość skrótu SHA256 dla każdego, a następnie dołączam ją do HASH.txt
pliku za pomocą certUitl
. Mój problem pochodzi z danych wyjściowych zwracanych przez narzędzie, a mianowicie (mam niemiecki Win 10):
SHA256-Hash der Datei BLAH.json:
d8338f6f2649bcb358e56e0973fe2f5a886771e0debbdb0fefef35976a1b88ca
CertUtil: -hashfile-Befehl wurde erfolgreich ausgeführt.
Chciałbym zdobyć wartość skrótu. W powyższym przykładzie byłoby to
d8338f6f2649bcb358e56e0973fe2f5a886771e0debbdb0fefef35976a1b88ca
który jest drugim wierszem wyniku. Szukałem rozwiązania, w jaki sposób uzyskać tylko określony wiersz wyniku i pomijać resztę, ale wszystko, co mogłem znaleźć, dotyczyło plików tekstowych, które nie wydają się zbyt pomocne. Jakieś pomysły, jak to zrobić?
źródło
Odpowiedzi:
Możesz ułatwić sobie życie, filtrując dane wyjściowe certutil za pomocą
findstr /V ":"
skrótu, który jest jedyną linią bez dwukropka.
Inne podejście polegające na otrzymaniu dowolnego określonego numeru linii:
Kolejny wariant przechowujący skrót i pełną nazwę pliku w
HASHjson.txt
Przykładowy przebieg:
źródło
<filename>.json : <hash-value>
fajne byłoby również przechowywanie nazwy pliku (coś podobnego ), ponieważ będę mógł później sprawdzić, czy prefiks (<filename>.json
) z każdej linii w pliku tekstowym faktycznie istnieje jako plik system plików i NASTĘPNIE obliczają ponownie wartość skrótu. Zwłaszcza w przypadku wielu plików wydaje się to być szybszym podejściem zamiast ślepego „mieszania” wszystkich plików za każdym razem. W takim przypadku lepiej jest przechowywać dane wyjściowe w zmiennej.Korzystając z tej odpowiedzi , otrzymałem życzenie:
Skrypt wyświetla plik
HASH.txt
z zawartością:Zasadniczo wyjście z
certUtil
traktowany jest jak zawartość pliku tekstowego, pozwalającego na wykorzystywanieskip
,delim
etc.źródło
findstr /V ":"
skrótu, który jest jedyną linią bez dwukropka. Możesz więc zamienić całe wnętrze naCertUtil -hashfile "%%f" SHA256 | findstr /V ":" >> HASH.txt
Aby przyspieszyć, użyj filtra zamiast zapętlania:
Druga linia w najbardziej wewnętrznym bloku (druga
for
nie jest pętlą!) Odrzuca puste wartości wartości skrótu.endlocal
jest niejawny z końcem pliku wsadowego.źródło
Jeśli mogę odpowiedzieć poleceniem unix (Microsoft ogłosi, że osadzi cały program narzędziowy unix w aktualizacji systemu Windows 10 i nowej wersji):
W przeciwnym razie dość łatwo jest „skopiować / wkleić” stary, uniksowy, wiarygodny program kompilacyjny dla systemu Windows, aby wykonać zadanie dość łatwo:
Przed tą aktualizacją systemu Windows 10 możesz użyć:
źródło