Método em lote simples para gerar nome de arquivo + CRC32 em uma linha de texto

Método em lote simples para gerar nome de arquivo + CRC32 em uma linha de texto

Minhas habilidades em lote são limitadas. Para produzir resultados para muitos arquivos, eu uso DIR /a-d /s /b > dirlist.txt. Eu importo dirlist.txt para o Excel (coluna A) e uso-o para produzir comandos arquivo por arquivo (na coluna B) que posso copiar para um arquivo em lote. É mais complicado do que fazer loop, mas pelo menos eu entendo.

A situação atual exige o cálculo do CRC32. Tenho uma ferramenta de linha de comando que expressa apenas o valor CRC32, sem o nome do arquivo correspondente. Portanto, minha solução Excel gera o nome do arquivo (ou seja, ECHO D:\[full path].ext >> output.txt) antes de calcular o valor CRC32 (ou seja, e comercial ( &) seguido por CRC32.exe "D:\[full path].ext" >> output.txt). Em outras palavras, a planilha produz um único comando que indica o nome do arquivo e depois o valor CRC32.

Infelizmente, isso coloca o nome do arquivo em uma linha, em output.txt, seguido pelo valor CRC32 na próxima linha. Acho que é possível colocar os dois na mesma linha, mas essa situação parece mais complicada do que os exemplos simples que estou vendo nos tutoriais. Portanto, a questão é: existe uma maneira relativamente simples de indicar o nome do arquivo e o valor CRC32 em uma única linha de saída?

Responder1

Se você não se opõe totalmente a uma solução em lote completo, isso deve funcionar para você:

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

Definimos uma variável para dirlist.txte output.txtpara facilitar a atualização daqueles com caminhos fixos, se você quiser, e seu DIRcomando permanece inalterado. Para os loops, podemos setlocal enabledelayedexpansionusar variáveis ​​​​in-loop; nosso loop inicial analisa cada linha ( token=*) da sua dirlist.txte atribui-a ao parâmetro %%A, que definimos como nossa pathvariável. Em seguida, temos nosso loop aninhado que é executado CRC32.execom nossa !path!variável como argumento e atribui a saída ao parâmetro e %%B, em seguida, define-a como a calcvariável. Por último, podemos ecoar !path!e !calc!na mesma linha do nosso output.txt. No exemplo acima eu os separei com a +(com base no título da sua pergunta), mas você pode usar o que quiser ou nada - lembre-se de que pode ser necessário escapar de um caractere especial com ^.
Gostaria de observar que não tenho CRC32.exe, portanto, a sintaxe do comando no loop for é baseada no meu entendimento da sua pergunta. Espero que isso ajude!

Responder2

Para todos os arquivos em um diretório e seus subdiretórios, calcule seu hash/soma de verificação com crc32.exe e gere o nome do caminho totalmente qualificado seguido pelo valor de hash na mesma linha para um arquivo de texto.

Downloadcrc32.exee coloque-o na pasta do 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 

informação relacionada