Cómo recorrer archivos que coinciden con el comodín en un archivo por lotes
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.
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.
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 %%I
variable, 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 %I
lo 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 /?
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...
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