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.txt
auch fest output.txt
, um die Aktualisierung dieser mit festen Pfaden bei Bedarf zu vereinfachen, und Ihr DIR
Befehl bleibt unverändert. Für die Schleifen setlocal enabledelayedexpansion
verwenden wir In-Loop-Variablen. Unsere erste Schleife sieht sich jede Zeile ( token=*
) Ihrer an dirlist.txt
und weist sie dem Parameter zu %%A
, den wir als unsere path
Variable festlegen. Als Nächstes haben wir unsere verschachtelte Schleife, die CRC32.exe
mit unserer !path!
Variablen als Argument ausgeführt wird und die Ausgabe dem Parameter zuweist %%B
und diesen dann als Variable festlegt . Schließlich können wir und in derselben Zeile unserer calc
echoen . 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