Cómo recorrer archivos que coinciden con el comodín en un archivo por lotes

Resuelto Luke Halliwell asked hace 16 años • 7 respuestas

Tengo un conjunto de nombres de archivos base, para cada nombre 'f' hay exactamente dos archivos, 'f.in' y 'f.out'. Quiero escribir un archivo por lotes (en Windows XP) que revise todos los nombres de archivos, para cada uno debería:

  • Mostrar el nombre base 'f'
  • Realizar una acción en 'f.in'
  • Realizar otra acción en 'f.out'

No tengo ninguna forma de enumerar el conjunto de nombres de archivos base, aparte de buscar *.in (o *.out), por ejemplo.

Luke Halliwell avatar Sep 02 '08 21:09 Luke Halliwell
Aceptado

Suponiendo que tiene dos programas que procesan los dos archivos, Process_in.exe y Process_out.exe:

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

%%~nf es un modificador de sustitución que expande %f solo a un nombre de archivo. Vea otros modificadores en https://technet.microsoft.com/en-us/library/bb490909.aspx (a mitad de la página) o simplemente en la siguiente respuesta.

Jim Buck avatar Sep 02 '2008 14:09 Jim Buck

Puede utilizar esta línea para imprimir el contenido de su escritorio:

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 

Una vez que tenga la %%Ivariable, es fácil ejecutar un comando en ella (simplemente reemplace la palabra echo con su programa)

Además, se ha mejorado la sustitución de referencias de variables FOR. Ahora puede utilizar la siguiente sintaxis opcional:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only (directory with \)
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

https://ss64.com/nt/syntax-args.html

En los ejemplos anteriores %I, PATH se puede reemplazar por otros valores válidos. La %~sintaxis termina con un nombre de variable FOR válido. Elegir nombres de variables en mayúsculas como %Ilo hace más legible y evita confusión con los modificadores, que no distinguen entre mayúsculas y minúsculas.

Puede obtener la documentación completa escribiendoFOR /?

Mark Ingram avatar Sep 02 '2008 14:09 Mark Ingram

La forma más fácil, a mi modo de ver, es utilizar un bucle for que llame a un segundo archivo por lotes para su procesamiento y le pase a ese segundo archivo el nombre base.

Según el para /? ayuda, el nombre base se puede extraer usando la ingeniosa opción ~n. Entonces, el script base diría:

for %%f in (*.in) do call process.cmd %%~nf

Luego, en process.cmd, suponga que %0 contiene el nombre base y actúe en consecuencia. Por ejemplo:

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt

Puede que haya una mejor manera de hacer esto en un solo script, pero siempre he estado un poco confuso sobre cómo extraer múltiples comandos en un solo bucle for en un archivo por lotes.

EDITAR: ¡Eso es fantástico! De alguna manera me había perdido la página de los documentos que mostraba que se podían hacer bloques de varias líneas en un bucle FOR. Voy a tener que regresar y reescribir algunos archivos por lotes ahora...

Nathan Fritz avatar Sep 02 '2008 14:09 Nathan Fritz

Ampliando la publicación de Nathans . Lo siguiente hará el lote de trabajo en un archivo por lotes.

@echo off

if %1.==Sub. goto %2

for %%f in (*.in) do call %0 Sub action %%~nf
goto end

:action
echo The file is %3
copy %3.in %3.out
ren %3.out monkeys_are_cool.txt

:end
Martin avatar Sep 02 '2008 15:09 Martin