Простой пакетный метод вывода имени файла + CRC32 в одной текстовой строке

Простой пакетный метод вывода имени файла + CRC32 в одной текстовой строке

Мои навыки пакетной обработки ограничены. Чтобы получить результаты для многих файлов, я использую DIR /a-d /s /b > dirlist.txt. Я импортирую dirlist.txt в Excel (столбец A) и использую его для создания команд по файлам (в столбце B), которые затем могу скопировать в пакетный файл. Это более громоздко, чем цикл, но, по крайней мере, я это понимаю.

Текущая ситуация требует вычисления CRC32. У меня есть инструмент командной строки, который выражает только значение CRC32 без соответствующего имени файла. Следовательно, мое решение Excel выводит имя файла (т. е. ECHO D:\[full path].ext >> output.txt) перед вычислением значения CRC32 (т. е. амперсанд ( &), за которым следует CRC32.exe "D:\[full path].ext" >> output.txt). Другими словами, электронная таблица выдает одну команду, которая указывает имя файла, а затем значение CRC32.

К сожалению, это помещает имя файла на одну строку в output.txt, а затем значение CRC32 на следующую строку. Я думаю, что возможно разместить их на одной строке, но эта ситуация кажется более сложной, чем простые примеры, которые я вижу в руководствах. Поэтому вопрос в том, есть ли относительно простой способ указать имя файла и значение CRC32 в одной строке вывода?

решение1

Если вы не против решения с полной пакетной обработкой, то вам подойдет следующее:

@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%
    )
)

Мы устанавливаем переменную для dirlist.txtи , output.txtчтобы упростить обновление тех, у которых есть фиксированные пути, если вы когда-нибудь захотите, и ваша DIRкоманда не изменится. Для циклов мы , setlocal enabledelayedexpansionпоэтому мы можем использовать переменные внутри цикла; наш начальный цикл просматривает каждую строку ( token=*) вашего dirlist.txtи назначает ее параметру %%A, который мы устанавливаем как нашу pathпеременную. Затем у нас есть наш вложенный цикл, который выполняется CRC32.exeс нашей !path!переменной в качестве аргумента и назначает вывод параметру %%B, затем устанавливает его как calcпеременную. Наконец, мы можем вывести !path!и !calc!на той же строке нашего output.txt. В примере выше я разделяю их с помощью +(на основе заголовка вашего вопроса), но вы можете использовать все, что захотите, или вообще ничего — просто помните, что вам может потребоваться экранировать специальный символ с помощью ^.
Я хотел бы отметить, что у меня нет CRC32.exe, поэтому синтаксис команды в цикле for основан на моем понимании вашего вопроса. Надеюсь, это поможет!

решение2

Для всех файлов в каталоге и его подкаталогах вычислите их хэш/контрольную сумму с помощью crc32.exe и выведите полное имя пути, а затем значение хэша в той же строке в текстовый файл.

Скачатьcrc32.exeи поместите его в папку Windows.

@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 

Связанный контент