.bat para renombrar xml y pdf

Espero me puedan ayudar, quiero cambiar el nombre de los archivos con .bat pero no lo logro, lo que quiero hacer es que quite las letras del RFC y solo me deje el folio de la factura, lo hice con el xml porque lo abre y busca el folio y se lo asigna pero con el pdf no lo logro.

Respuesta
1

No entiendo muy bien lo que dices, entre otras cosas porque no tengo ni idea de lo que pueden ser "las letras del RFC" ni "el folio de la factura". Parece que te estás refiriendo a archivos generados por algún programa concreto. En todo caso, independientemente de cuál sea el origen de los archivos y sus nombres, renombrar archivos no debería dar problemas, por lo que parece que quieres hacer algo más que renombrarlos. Te sugiero que pongas un ejemplo más o menos real de lo que quieres y lo que ocurre cuando lo intentas y no lo consigues.

Gracias por responder, si alo mejor no me supe explicar mira tengo dos archivos uno xml y otro pdf con los siguientes nombres

XML=  HETE740108LY82945

PDF= HETE740108LY82945

y lo que quiero hacer es que queden solo asi 

XML= 2945

PDF= 2945

Osea que los últimos 4 dígitos son el folio pero lo único que logre fue renombrar el xml

echo off
Setlocal EnableDelayedExpansion
for /f %%z in ('dir /b *.xml') do (
for /f "delims=" %%a in ('find /i "Folio=" ^< "%%z"') do (
set linea=%%a
set linea=!linea:"=!
set linea=!linea:^>=!
call :tratar "%%z" !linea!
)
)
goto :eof
:tratar
set nomarch=%1
:bucle
shift
if "%1"=="Folio" (
set nuevo=%~2
ren %nomarch% "!nuevo!.xml"
goto :eof
)
goto :bucle

***y del pdf tenia esto 

@echo off
for /R "." %%a in (*.pdf) do (SET ruta=%%a&SET archivo=%%~nxa&CALL :renombrar)
pause
:renombrar
set archivo=%archivo:<5=%
ren "%C:\Renombrar_Factura_Red%" "%archivo%"
goto:eof

Pero lo que quiero es que sea un solo .bat para ambos

Ahora entiendo algo más, pero el primer bat parece renombrar un archivo XML con un nombre extraído del propio archivo, de una línea en la que figure el texto "Folio", y no del propio nombre del archivo. Sin embargo de lo que dices (no del bat, sino del texto) se podría extraer la idea de que puedes tener dos archivos de nombres:

HETE740108LY82945.xml

HETE740108LY82945.pdf

Y que quieres que pasen a llamarse

2945.xml

2945.pdf

Para esto último debería valer este bat:

Echo off
set carpeta=d:\carpeta prueba
pushd %carpeta%
for /f "delims=" %%z in ('dir /b *.xml') do (call :renomb "%%z")
for /f "delims=" %%z in ('dir /b *.pdf') do (call :renomb "%%z")
popd
goto :eof
:renomb
set act=%~n1
set ext=%~x1
set nue=%act:~-4%
ren %1 "%nue%%ext%"
goto :eof

Si quieres ver como va a ser el comando de renombrado sin ejecutarlo solo tienes que precederlo de ECHO. Cuando ya te parezca que hace lo que debe le quitas el ECHO. En la variable CARPETA puedes poner el path de la carpeta de trabajo.

Pero insisto en que me parece que no es exactamente esto lo que buscas.

Muchas gracias, si es exacto lo que queria, de verdad se lo agradezco mucho, si no es abusar de su ayuda tendrá alguna forma de que si estos archivos se encuentran en carpetas separadas es decir 

esta la carpeta de pdf y la carpeta de xml  y yo los quiero pasar a una carpeta llamada facturas pero que se trasladen ya renombrados se puede ? 

Prueba con esto. Ahora no se puede usar el comando REN porque el renombrado solo se puede hacer sobre la carpeta origen, pero un COPY puede hacer lo que necesitas. Si quieres borrar el archivo original quítale el REM al comando DEL.

Echo off
set carpxml=d:\carpeta prueba
set carppdf=d:\carpeta prueba
set carpfac=d:\temp\carpeta prueba
for /f "delims=" %%z in ('dir /b "%carpxml%\*.xml"') do (call :renomb "%carpxml%\%%z")
for /f "delims=" %%z in ('dir /b "%carppdf%\*.pdf"') do (call :renomb "%carppdf%\%%z")
goto :eof
:renomb
echo %1
set act=%~n1
set ext=%~x1
set nue=%act:~-4%
copy %1 "%carpfac%\%nue%%ext%"
rem del %1
goto :eof

Asigna los valores adecuados a las variables CARPXML, CARPPDF y CARPFAC.

Se me quedó un comando de depuración, el

Echo %1

No es necesario, aunque indica que archivo se está tratando.

Muchísimas gracias funciona muy bien se lo agradezco,cualquier cosa es VB o soporte dígame

Me alegro mucho de que funcione. Y tendré en cuenta tu ofrecimiento para VB si se diera el caso.

otra vez yo molestándote, es que me quede pensando y cuando el número de folio rebase los 4 dígitos ? entonces pensé podría haber un .bat que si mis archivos se llaman 

HGR0509285X2_EVA040520K34_A_42109.pdf

HGR0509285X2_EVA040520K34_A_42109.XML 

y solo quiero dejar los últimos dígitos después del ultimo guion bajo se puede ? dejando lo último que copie a otra carpeta. 

Tres aclaraciones respecto a esto último:

  1. ¿Se trata de un BAT diferente o de una adaptación del último BAT? Es decir, los nombres en los que el folio ocupaba 4 posiciones, ¿van también precedidos de un guión bajo y, por tanto, los ejemplos de partida eran más bien algo como HETE740108LY8_2945.xml?
  2. Sea o no un BAT diferente, ¿la estructura del nombre es fija en lo que a guiones bajos se refiere? Es decir, ¿hay siempre 3 guiones bajos en el nombre o el número de guiones bajos es variable y queremos quedarnos con el último, sea el que sea?
  3. No entiendo bien que significa "dejando lo último que copie a otra carpeta"

seria una adaptación al último bat, aunque te puse un ejemplo del RFC mi error fue no porner completa la info.

La estructura es fija siempre, solo hay 3 guiones bajos y el folio es el que viene después del último guión bajo pero este es incremental y como será un .bat que se programe para ejecutarse automático en el servidor cuando llegue al folio _100000, entonces no aparecerá completo, era por eso mi duda.

es decir si tengo este nombre

HGR0509285X2_EVA040520K34_A_42109.pdf

debe siempre quedar 

42109

lo que esta después del último guión bajo. Disculpa es que de verdad tengo que ver todos estos puntos :(

A ver si esto funciona como esperas:

Echo off
set carpxml=d:\carpeta prueba
set carppdf=d:\carpeta prueba
set carpfac=d:\temp\carpeta prueba
for /f "delims=" %%z in ('dir /b "%carpxml%\*.xml"') do (call :renomb "%carpxml%\%%z")
for /f "delims=" %%z in ('dir /b "%carppdf%\*.pdf"') do (call :renomb "%carppdf%\%%z")
goto :eof
:renomb
set act=%~n1
for /f "tokens=4,* delims=_." %%a in ('echo %~1') do (copy %1 "%carpfac%\%%a.%%b")
goto :eof

El comando

set act=%~n1

no es necesario

Supongo que estás ocupada y no has podido probarlo, ¿no?

Muchas gracias, hasta hoy lo probé, lo me hace nada así como lo envías le agregue los siguiente y ya me envía que esta copiando los archivos pero no los copia, esté es el bat que modificado

Echo off
set carpxml=H:\FACTURAS\XML
set carppdf=H:\FACTURAS\PDF
set carpfac=H:\FACTURAS
for /f "delims=" %%z in ('dir /b "%carpxml%\*.xml"') do (call :renomb "%carpxml%\%%z")
for /f "delims=" %%z in ('dir /b "%carppdf%\*.pdf"') do (call :renomb "%carppdf%\%%z")
goto :eof
:renomb
echo %1
set act=%~n1
set ext=%~x1
for /f "tokens=5,* delims=_." %%a in ('echo %~1') do (copy %1 "%carpfac%\%%a.%%b")
rem del %1
goto :eof

¿Por qué le has puesto tokens=5,*?

Obviamente los comandos:

set act=%~n1
set ext=%~x1

no pueden hacer nada porque las variables ACT y EXT no se utilizan. Para depurar el BAT será mejor "expandir" el FOR de la rutina RENOMB.

Prueba a trabajar con esta versión:

Echo off
set carpxml=H:\FACTURAS\XML
set carppdf=H:\FACTURAS\PDF
set carpfac=H:\FACTURAS
for /f "delims=" %%z in ('dir /b "%carpxml%\*.xml"') do (call :renomb "%carpxml%\%%z")
for /f "delims=" %%z in ('dir /b "%carppdf%\*.pdf"') do (call :renomb "%carppdf%\%%z")
goto :eof
:renomb
echo %1
for /f "tokens=4,* delims=_." %%a in ('echo %~1') do (
   Echo el folio es %%a y la extension %%b
 echo el comando a ejecutar sera: copy %1 "%carpfac%\%%a.%%b"
   copy %1 "%carpfac%\%%a.%%b"
   )
goto :eof

Y a ver que te sale. Desde luego en mis pruebas funciona correctamente. Si quieres ejecútalo desde una ventana CMD y me pones un pantallazo de la ejecución.
Por cierto, si quieres sacar el código en una ventanita (considero que así resulta más legible) usa la herramienta "<>" del editor de la página (snippet)

Creo que el problema estriba en que el path completo de los archivos a renombrar/copiar tiene más puntos y guiones bajos que los del propio nombre de los archivos. Eso hace que el FOR de la rutina de renombrado/copia no funcione correctamente. A ver si mañana tengo un rato para estudiar el asunto con un poco más de cuidado y lo resuelvo. De lo que no tengo duda es de que habrá solución pero habrá que tener paciencia.

Prueba con esto (no he tenido ocasión de hacer pruebas exhaustivas pero creo que puede funcionar en tu entorno):

Echo off
set carpxml=d:\carpeta prueba
set carppdf=d:\carpeta prueba
set carpfac=d:\temp\carpeta prueba
for /f "delims=" %%z in ('dir /b "%carpxml%\*.xml"') do (call :renomb "%carpxml%\%%z")
for /f "delims=" %%z in ('dir /b "%carppdf%\*.pdf"') do (call :renomb "%carppdf%\%%z")
goto :eof
:renomb
set nombre=%~n1
set ext=%~x1
for /f "tokens=4,* delims=_" %%a in ('echo %nombre%') do (copy %1 "%carpfac%\%%a%ext%")
goto :eof

¿Cómo va esto? ¿Has podido probarlo?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas