Tengo un conjunto de nombres de archivo base, para cada nombre 'f' hay exactamente dos archivos, 'f.in' y 'f.out'. Quiero escribir un archivo por lotes (en Windows XP) que pasa por todos los nombres de archivo, para cada uno debería:
- Mostrar el nombre base 'f'
- Realizar una acción en 'f.in'
- Realice otra acción en 'f.out'
No tengo ninguna manera de enumerar el conjunto de nombres de archivo base, aparte de buscar * .in (o * .out) por ejemplo.
command-line
windows-xp
batch-file
Luke Halliwell
fuente
fuente
Respuestas:
Suponiendo que tiene dos programas que procesan los dos archivos, process_in.exe y process_out.exe:
%% ~ 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 solo en la siguiente respuesta.
fuente
%%f
¿por qué es más%%~nf
tarde?~
modificadores para hacer cosas, como en mi ejemplo, solo obtén el nombre del archivo. Es solo un hábito para mí usar eso en caso de que*
haga el camino completo o algo así. Hay un puñado de estos modificadores (a mitad de la página): microsoft.com/resources/documentation/windows/xp/all/proddocs/…Puede usar esta línea para imprimir el contenido de su escritorio:
Una vez que tengas el
%%I
variable, es fácil ejecutar un comando sobre ella (solo reemplace la palabra echo con su programa)Además, se ha mejorado la sustitución de referencias de variables FOR. Ahora puede usar la siguiente sintaxis opcional:
https://ss64.com/nt/syntax-args.html
En los ejemplos anteriores
%I
PATH puede reemplazarse por otros valores válidos. los%~
sintaxis termina con un nombre válido de variable FOR. Elegir nombres de variables en mayúsculas como%I
hace que sea más legible y evita la confusión con los modificadores, que no distinguen entre mayúsculas y minúsculas.Puede obtener la documentación completa escribiendo
FOR /?
fuente
%%I was unexpected at this time.
%I
lugar de%%I
La forma más fácil, según lo veo, es usar un bucle for que llame a un segundo archivo por lotes para su procesamiento, pasando a ese segundo archivo el nombre base.
Según el para /? ayuda, basename se puede extraer usando la opción ingeniosa ~ n. Entonces, el script base leería:
Luego, en process.cmd, suponga que% 0 contiene el nombre base y actúe en consecuencia. Por ejemplo:
Puede haber una mejor manera de hacer esto en un script, pero siempre he sido 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 en los documentos que mostraba que podía hacer bloques de varias líneas en un bucle FOR. Voy a tener que regresar y reescribir algunos archivos por lotes ahora ...
fuente
Ampliando en la publicación de Nathans . Lo siguiente hará el lote de trabajo en un archivo por lotes.
fuente
Hay una herramienta que generalmente se usa en los servidores MS (hasta donde puedo recordar) llamada forfiles :
El enlace anterior contiene ayuda, así como un enlace a la página de descarga de microsoft.
fuente
El siguiente código filtra los nombres de archivo que comienzan con una subcadena dada. Se podría cambiar para adaptarse a diferentes necesidades trabajando en la extracción de subcadenas de subfnombres y la declaración IF:
fuente
Hacer eco de f.in y f.out separará el concepto de qué hacer un bucle y qué no hacer cuando se usa en un bucle for / f.
Aunque no preguntó, una buena manera de pasar comandos a f.in y f.out sería ...
Un enlace a todos los comandos de Windows XP: enlace
Pido disculpas si no respondí esto correctamente. La pregunta fue muy difícil de leer para mí.
fuente