Мои навыки пакетной обработки ограничены. Чтобы получить результаты для многих файлов, я использую 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