Einfache Batch-Methode zur Ausgabe von Dateiname + CRC32 in einer Textzeile

Einfache Batch-Methode zur Ausgabe von Dateiname + CRC32 in einer Textzeile

Meine Batch-Kenntnisse sind begrenzt. Um Ergebnisse für viele Dateien zu erzeugen, verwende ich DIR /a-d /s /b > dirlist.txt. Ich importiere dirlist.txt in Excel (Spalte A) und verwende es, um Datei-für-Datei-Befehle zu erzeugen (in Spalte B), die ich dann in eine Batch-Datei kopieren kann. Das ist umständlicher als eine Schleife, aber ich verstehe es zumindest.

Die vorliegende Situation erfordert eine CRC32-Berechnung. Ich habe ein Befehlszeilentool, das nur den CRC32-Wert ohne den entsprechenden Dateinamen ausgibt. Daher gibt meine Excel-Lösung den Dateinamen aus (d. h. ECHO D:\[full path].ext >> output.txt), bevor der CRC32-Wert berechnet wird (d. h. Et-Zeichen ( &) gefolgt von CRC32.exe "D:\[full path].ext" >> output.txt). Mit anderen Worten: Die Tabelle erzeugt einen einzelnen Befehl, der den Dateinamen und dann den CRC32-Wert angibt.

Leider wird dadurch der Dateiname in einer Zeile in output.txt ausgegeben, gefolgt vom CRC32-Wert in der nächsten Zeile. Ich denke, es ist möglich, beides in derselben Zeile zu haben, aber diese Situation scheint komplizierter als die einfachen Beispiele, die ich in Tutorials sehe. Die Frage ist also, ob es eine relativ einfache Möglichkeit gibt, den Dateinamen und den CRC32-Wert in einer einzigen Ausgabezeile anzugeben?

Antwort1

Wenn Sie einer vollständigen Batch-Lösung nicht grundsätzlich ablehnend gegenüberstehen, sollte dies für Sie funktionieren:

@echo off

set "list=dirlist.txt"
set "out=output.txt"

dir /a-d /s /b > %list%

setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (%list%) do (
    set "path=%%A"
    for /f %%B in ('CRC32.exe "!path!"') do (
        set "calc=%%B"
        echo !path! + !calc! >> %out%
    )
)

Wir legen eine Variable sowohl für als dirlist.txtauch fest output.txt, um die Aktualisierung dieser mit festen Pfaden bei Bedarf zu vereinfachen, und Ihr DIRBefehl bleibt unverändert. Für die Schleifen setlocal enabledelayedexpansionverwenden wir In-Loop-Variablen. Unsere erste Schleife sieht sich jede Zeile ( token=*) Ihrer an dirlist.txtund weist sie dem Parameter zu %%A, den wir als unsere pathVariable festlegen. Als Nächstes haben wir unsere verschachtelte Schleife, die CRC32.exemit unserer !path!Variablen als Argument ausgeführt wird und die Ausgabe dem Parameter zuweist %%Bund diesen dann als Variable festlegt . Schließlich können wir und in derselben Zeile unserer calcechoen . Im obigen Beispiel trenne ich sie mit einem (basierend auf dem Titel Ihrer Frage), aber Sie können verwenden, was Sie möchten, oder gar nichts – denken Sie nur daran, dass Sie ein Sonderzeichen eventuell mit maskieren müssen . Ich möchte darauf hinweisen, dass ich CRC32.exe nicht habe, die Syntax des Befehls in der For-Schleife basiert also auf meinem Verständnis Ihrer Frage. Hoffentlich hilft das!!path!!calc!output.txt+^

Antwort2

Berechnen Sie für alle Dateien in einem Verzeichnis und seinen Unterverzeichnissen deren Hash/Prüfsumme mit crc32.exe und geben Sie den vollqualifizierten Pfadnamen gefolgt vom Hashwert in derselben Zeile in eine Textdatei aus.

Herunterladencrc32.exeund legen Sie es in Ihrem Windows-Ordner.

@echo off
setlocal enableextensions
cd.> dirlist.txt
for /F "eol=| tokens=* delims=" %%g in ('dir *.* /S /A-D /B 2^>nul') do (
for /F %%h in ('%systemroot%\crc32.exe "%%g"') do (
echo %%g + %%h >> dirlist.txt
)
)
exit 
rem 

verwandte Informationen