Mis habilidades por lotes son limitadas. Para producir resultados para muchos archivos, uso DIR /a-d /s /b > dirlist.txt
. Importo dirlist.txt a Excel (columna A) y lo uso para producir comandos archivo por archivo (en la columna B) que luego puedo copiar en un archivo por lotes. Es más engorroso que hacer un bucle, pero al menos lo entiendo.
La situación actual exige el cálculo del CRC32. Tengo una herramienta de línea de comandos que expresa sólo el valor CRC32, sin el nombre de archivo correspondiente. Por lo tanto, mi solución de Excel genera el nombre del archivo (es decir, ECHO D:\[full path].ext >> output.txt
) antes de calcular el valor CRC32 (es decir, el signo ( &
) seguido de CRC32.exe "D:\[full path].ext" >> output.txt
). En otras palabras, la hoja de cálculo produce un único comando que indica el nombre del archivo y luego el valor CRC32.
Desafortunadamente, esto coloca el nombre del archivo en una línea, en output.txt, seguido del valor CRC32 en la siguiente línea. Creo que es posible poner los dos en la misma línea, pero esta situación parece más complicada que los ejemplos simples que veo en los tutoriales. Entonces la pregunta es: ¿existe una forma relativamente sencilla de indicar el nombre del archivo y el valor CRC32 en una sola línea de salida?
Respuesta1
Si no se opone por completo a una solución por lotes completa, esto debería funcionar para usted:
@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%
)
)
Establecimos una variable para dirlist.txt
y output.txt
para que sea más fácil actualizar aquellos con rutas fijas si alguna vez lo desea, y su DIR
comando no se modifica. Para los bucles, podemos setlocal enabledelayedexpansion
usar variables dentro del bucle; nuestro bucle inicial echa un vistazo a cada línea ( token=*
) de su dirlist.txt
y la asigna al parámetro %%A
, que configuramos como nuestra path
variable. A continuación tenemos nuestro bucle anidado que se ejecuta CRC32.exe
con nuestra !path!
variable como argumento y asigna la salida al parámetro %%B
, luego lo establece como calc
variable. Por último, podemos hacer eco !path!
y !calc!
en la misma línea de nuestro output.txt
. En el ejemplo anterior, los separo con +
(según el título de su pregunta), pero puede usar lo que quiera o nada en absoluto; solo recuerde que es posible que necesite escapar de un carácter especial con ^
.
Me gustaría señalar que no tengo CRC32.exe, por lo que la sintaxis del comando en el bucle for se basa en mi comprensión de su pregunta. ¡Ojalá esto ayude!
Respuesta2
Para todos los archivos en un directorio y sus subdirectorios, calcule su hash/suma de verificación con crc32.exe y genere el nombre de ruta completo seguido del valor hash en la misma línea en un archivo de texto.
Descargarcrc32.exey colóquelo en su carpeta de 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