Necesito hacer un archivo BAT
Tengo archivos que caen en diferentes carpetas cada carpeta tiene una sigla diferente de 3 unidades ejemple rrp; rrg; rmd Etc y dentro de estas caen archivos con la siguiente estructura PRY Nro 0001-00010200 y necesito hacer un BAT que haga lo siguiente para los archivos que estan dentro de la carpeta rrp que los renombre de la siguiente manera rrp pry10200.pdf asi para cada uno de los existenes, en definitiva que copie el nombre de la carpeta donde esta alojado el archivo y a su vez que suprima una serie de caracteres del nombre original, me ayudan por favor? GRACIAS
1 Respuesta
Si te entiendo bien quieres hacer un bat que revise tres carpetas, de nombres rrp, rrg y rmd, de una cierta unidad (digamos c: o d:) y, para cada uno de los archivos que existan en esas carpetas, le cambie el nombre a uno nuevo que contenga, en primer lugar, el nombre de la carpeta, luego un espacio, y luego parte del nombre original en la que se hayan suprimido los caracteres que ocupaban determinadas posiciones fijas. Además hay que añadirle la extensión PDF. ¿Los archivos se dejan en las carpetas originales o hay que moverlos? En el ejemplo concreto que comentas el archivo de nombre "PRY Nro 0001-00010200" situado en la carpeta rrp pasaría a llamarse "rrp pry10200.pdf". El cambio de mayúsculas a minúsculas, ¿también debe hacerse? ¿Hay qué eliminar los caracteres de las posiciones de la 4 a la 16, ambas incluidas, en el nombre original? ¿Los nombres de las carpetas son fijos o se pasan como parámetros?
Aclárame estos puntos y empezamos a trabajar.
¡Gracias! Bueno paso a aclarar mejor lo que necesito por que no me he explicado bien.
Tengo un sofware que todas las mañanas genera diferentes reportes en pdf que los aloja segun el caso en 13 Carpetas diferentes las cuales estan nomencladas en un nombre X con 3 siglas como parte inicial de su nombre completo, en cada una de ellas se alojan archivos con la siguiente estructura PRY Nro xxxx-xxxxxxxx.pdf los cuales necesito renombrarlos con las 3 cifras iniciales de su carpeta correspondiente y a su vez suprimir algunos caracteres internos ya que de esa forma los lee otro progarama (Google Site) y me muestra la imagen de los pdf.
Un ejemplo seria asi los archivos que estan en la Carpeta "RPP facturas de compras adeudadas (Pagos Pendientes)" y que dentro de esta estan los siguientes archivos
PRY Nro 0001-00010000.pdf - PRY Nro 0001-00010200.pdf - PRY Nro 0001-00010300.pdf - PRY Nro 0001-00010442.pdf etc.
Y deberian quedar renombrados dentro de la misma carpeta de la siguiente manera
RPP PRY10000.pdf - RPP PRY10200.pdf - RPP PRY10300.pdf - RPP PRY10442.pdf y asi para cada grupo que esta dentro de estas 13 carpetas.
Lo que si una vez hecho el bat una vez renombrados los archivos se va a encontrar con la complicación que el día anterior tendrá muchos con el mismo nombre por lo que debería pisar los que tengan el mismo nombre y no borrar los anteriores que no tengan el mismo nombre
Muchas Gracias Nuevamente
Perdona pero todavía no tengo muy claras algunas cosas:
1. En cada una de las carpetas, ¿puede haber archivos que no deban ser renombrados? Si fuera así, ¿qué característica puede usarse para saber si se deben renombrar o no?
2. Supongo que no puede haber archivos cuyo nombre solo difiera precisamente en la parte que se va a "despreciar" del nombre, por ejemplo no puede haber en la misma carpeta un archivo que se llame "PRY Nro 0001-00010200.pdf" y otro que se llame "PRY Nro 0002-00010200.pdf" o "PRY Nro 0001-00110200.pdf". ¿Es correcta mi suposición?
3. ¿Se conocen previamente los nombres de las 13 carpetas a explorar? Si es así se podrían incluir en una lista dentro del propio BAT.
4. Tu última aclaración no la acabo de entender. Intuyo que tiene que ver con que si al aplicar el BAT un día se asigna un nombre a uno de los archivos podría ocurrir que al día siguiente, al volver a aplicar el BAT, el nombre resultante coincidiera con uno del día anterior. Si ocurre eso se "machaca" el anterior, ¿no?
Ya me queda claro que los archivos ya tienen la extensión PDF adecuada y que el "PRY" del nombre seguirá en mayúsculas.
Te paso un intento:
@echo off
Setlocal EnableDelayedExpansion
set ruta=d:\bat
set carpeta=pba
for /f "tokens=*" %%x in ('dir /b %ruta%\%carpeta%\*.*') do (
echo %%x
set nombre=%%x
echo ren "%ruta%\%carpeta%\!nombre!" "%carpeta% !nombre:~16!"
)
Donde pone "ruta=d:\bat" deberías poner la ruta en las que están las carpetas a tratar, donde pone "carpeta=pba" deberías poner el nombre de la carpeta con la que quieras probar (por ejemplo RPP). En lugar de hacer el renombrado se hace eco del comando que se aplicaría, una vez que quede claro que es correcto.
Mira a ver si con esto avanzamos algo.
¡Gracias! Nuevamente Paso a responder tus inquietudes
1- Si en cada una de las Carpetas existirán archivos que no deben ser renombrados, la caracterista seria renombrar todos aquellos que comienzan con PRY
2- En las Carpetas nunca se dará el caso que mencionas.
3- Si se conoce previamente el nombre de las Carpetas
GRACIAS
Bien. Ya falta menos.
En la prueba que te pasé había un error. En lugar de
echo ren "%ruta%\%carpeta%\!nombre!" "%carpeta% !nombre:~16!"
Debería decir:
Echo ren "%ruta%\%carpeta%\!nombre!" "%carpeta% !nombre:~0,3!!nombre:~16!"
Un bat ya algo más ajustado sería este:
@echo off
Setlocal EnableDelayedExpansion
set ruta=d:\bat
for %%c in (rPP rCA PRI rRG rFP rOC rCP rPC rFC rHI rFP rPI rRH) do (
set carpeta=%%c
for /f "tokens=*" %%x in ('dir /b %ruta%\!carpeta!\PRY*.pdf') do (
echo %%x
set nombre=%%x
echo ren "%ruta%\!carpeta!\!nombre!" "!carpeta! !nombre:~0,3!!nombre:~16!"
)
)
Al ejecutarlo saldrá el mensaje "El sistema no puede hallar el archivo especificado." para cada una de las carpetas que no tenga ningún archivo PRY*.pdf, pero eso solo quiere decir que no se renombraría nada en esa carpeta. Como antes habría que asignarle a la variable ruta (tercera linea del BAT) la ruta donde están las carpetas (espero que estén todas en la misma, si no fuera así habría que incluir la ruta en el nombre de las carpetas). También como antes de momento solo hace eco del comando de renombrado que se ejecutaría una vez que se compruebe que la cosa va bien. Bastaría borrar el "echo" del último comando dejándolo como:
Ren "%ruta%\!carpeta!\!nombre!" "!carpeta! !nombre:~0,3!!nombre:~16!"
Dime si has probado y que tal va resultando.
¡Gracias! He escrito la ruta donde están alojadas las Carpetas y luego lo ejecute pero me dice que el sistema no puede encontrar la ruta especificada
Inserta la instrucción
echo %ruta%\!carpeta!
Después de "set carpeta=%%c" a ver si nos da una pista de que estamos (estoy, claro) haciendo mal. Yo no veo donde puede estar el problema. En mis pruebecillas locales funciona bien.
Ya me dirás.
¡Perdón! Creo que ya sé lo que pasa.
No le pongas comillas al valor de la ruta y cambia el comando DIR del segundo FOR por el siguiente:
'dir /b "%ruta%\!carpeta!\PRY*.pdf"'
Fíjate que al final hay comillas dobles seguidas de comilla simple
¡Gracias!
Agregue el escrito que me dijiste y seguimos en la misma sigue sin encontrar la ruta
Además te saque el dir que me pediste
Se te ha olvidado quitar las comillas al valor de la ruta:
set ruta=C:\Users\lgaspart\Google Drive\30 Reportes Táctica
Prueba a insertar la instrucción:
echo dir /b "%ruta%\!carpeta!\PRY*.pdf"
después de "set carpeta=%%c".
Por cierto, ¿trabajas con Windows 7 o Windows 8?
Otras dos cosas que se me han ocurrido:
1. ¿Hay actualmente en alguna de las carpetas revisadas algún archivo con nombre que responda al patrón PRY*.pdf? Porque si no lo hubiera tal vez nos esté despistando ese hecho y, por alguna razón, el mensaje en tu caso es "El sistema no puede encontrar la ruta especificada" en lugar del que, según te comenté en su momento, me sale a mí ""El sistema no puede hallar el archivo especificado."
2. Para ignorar la influencia de la variable ruta podríamos probar con un bat que no la use, partiendo de que el bat ya está situado en la carpeta raíz de las otras trece. Sería:
@echo off
Setlocal EnableDelayedExpansion
for %%c in (rPP rCA PRI rRG rFP rOC rCP rPC rFC rHI rFP rPI rRH) do (
set carpeta=%%c
for /f "tokens=*" %%x in ('dir /b !carpeta!\PRY*.pdf"') do (
echo %%x
set nombre=%%x
ren !carpeta!\!nombre!" "!carpeta! !nombre:~0,3!!nombre:~16!"
)
)
Mientras tanto estoy intentando reproducir tu situación con Windows 8 porque no le veo explicación, pero tiene que tenerla.
Perdón, me falta abrir comillas en el comando DIR del segundo FOR y en el REN. Serían:
for /f "tokens=*" %%x in ('dir /b "!carpeta!\PRY*.pdf"') do (
y
Ren "!carpeta!\!nombre!" "!carpeta! !nombre:~0,3!!nombre:~16!"
Creo que ya lo encontré (¿no he dicho esto antes ;-)?). Cuando me pasaste la lista de carpetas interpreté mal la información. Creía que los nombres de las carpetas eran de tres caracteres y que lo que figuraba a su lado era un comentario descriptivo. Al revisar con cuidado la información del dir que te pedí me di cuenta de que el "comentario" formaba parte del nombre de la carpeta. Por tanto no estaba formando correctamente los nombres de las carpetas. De modo que olvida todo lo anterior y prueba este BAT:
@echo off
Setlocal EnableDelayedExpansion
set ruta=C:\Users\lgaspart\Google Drive\30 Reportes Táctica
for %%c in (
"rPP facturas de compras adeudadas (Pagos Pendientes)"
"rCA Car tula"
"PRI Informe PRI"
"rRG Rendiciones de gastos"
"rFP Factura de Proveedores (todas) por proveedor"
"rOC ¢rdenes de Compra (todas) por proveedor"
"rCP ¢rdenes de Compra Pendientes"
"rPC facturas Pendientes de Cobro"
"rFC Facturas emitidas (todas) (de Clientes)"
"rHI Horas de Ingenier¡a consumidas por recurso"
"rPF Plan de Facturaci¢n"
"rPI Pedidos internos"
"rRH horas estimadas vs horas utilizadas (Registros de horas)"
) Do (
set carpeta=%%c
set carpeta=!carpeta:"=!
for /f "tokens=*" %%x in ('dir /b "%ruta%\!carpeta!\PRY*.pdf"') do (
set nombre=%%x
rem del "%ruta%\!carpeta!\!carpeta:~0,3! !nombre:~0,3!!nombre:~16!"
Ren "%ruta%\!carpeta!\!nombre!" "!carpeta:~0,3! !nombre:~0,3!!nombre:~16!"
)
)
La instrucción de borrado (DEL) está comentada para que no haga ningún estropicio pero supongo que habrá que habilitarla para que borre el archivo preexistente antes de renombrar el actual, si ya existe un archivo con el nombre que le vamos a poner.
Yo creo que ahora irá bien. Si no fuera así entonces léete los dos o tres mensajes anteriores a éste y haz lo que decía en ellos.
Buenos días, nuevamente Gracias por tu tiempo, quiero comentarte que el resultado del BAT creo que esta vez esta bien, solo que al ejecutarlo no realizo la acción esperada, ya que no renombro ningún archivo.
Por los mensajes que salen parece que ya existe un archivo con el mismo nombre. Si es así, como te decía en mi anterior mensaje, habría que habilitar el comando de borrado (comando DEL) que precede al renombrado.
Comprueba si puede ser ese el "problema" y si fuera así quítale el "REM" que precede al "DEL" en ese comando y vuelve a probar.
¡Gracias! Vamos avanzando ahora si los renombra, solo que para cuando existe un archivo con el mismo nombre no lo renombra solo deja el viejo que ya estaba, y lo que necesito es cuando haya uno que al renombrarlo queda igual que borre la version vieja y deje el nuevo, juro que esto es lo ultimo y no te molesto mas
Perdón esl BAT esta bien realiza la acción correcta.
Solo que en el caso de la Carpeta Rca Caratula en el BAT que escribiste para la segunda "a" que lleva acento dejaste un espacio distinto a las otras palabras que llevan asentó donde usaste el siguiente carácter ¢, y justo en esa carpeta no hace nada y si le cambio a la palabra Caratula y la escribo Car¢tula tampoco hace nada,¿tienes idea porque podrá ser solo en este caso?
Gracias
El problema es típico entre el juego de caracteres MSDOS y el juego de caracteres Windows. La a acentuada MSDOS corresponde a un código que para Windows no es representable y lo saca como un espacio. Si al listar el bat en entorno MSDOS la carpeta rCA se ve como "rCA Carátula" es que el carácter es el adecuado. Si no se ve así, hay que ver como conseguimos introducir el carácter correcto en el BAT. Yo tengo editores de texto que manejan sin problema esas diferencias pero el Bloc de notas no vale para el caso de la "á". Si tienes el Word 2010 o el 2013 (supongo que los anteriores también pero ya no puedo probarlo) la solución podría ser cargar el bat desde Word, cuando pregunte por la codificación para leer el documento se marca MS-DOS, luego se comprueba si los nombres de las carpetas son los correctos. Los que no lo sean (como la carpeta rCA que no deberá tener la "á" sino un espacio) se corrigen para que se lean correctamente. Una vez que todo tenga el aspecto adecuado se pulsa en el botón de "Guardar" y se ignora la advertencia que debe salir, forzando que Word lo guarde en el último formato (MS-DOS). A continuación se comprueba, desde una ventana CMD/MS-DOS que la solución ha funcionado.
Si sigues teniendo problemas avísame y buscaremos otra solución.
- Compartir respuesta