Batch para modificar múltiples archivos xml basándose en su contenido especifico.

Estoy intentando generar un bat para renombrar más de 500 archivos utilizando una etiqueta de su contenido(noIdentificacion), la cual no siempre aparece en la misma posición.

El nombre de uno de los archivo es :A-000771139. Mxl y necesito se renombre como el valor del nodo que esta en su interior noIdentificacion="9991239999ZH". El nombre final seria 9991239999ZH.xml y así por cada uno de los archivos.

El siguiente código hace lo que requiero pero solo cuando la intentar (noIdentificacion) siempre este en el mismo lugar.

@echo off
for /f "delims=" %%Z in ('dir /b *.xml') do (
for /f "tokens=12 delims== " %%A in (
'find /i "noIdentificacion=" ^< "%%Z"'
) do ren "%%Z" "%%A.xml"
)

anexo el contenido del archivo para las pruebas que sean necesarias.

<?xml version="1.0" encoding="UTF-8"?>fecha="2017-07-06T23:46:42" folio="000771139" formaDePago="Una sola exhibición" metodoDePago="03" noCertificado="00001000000402850319" 4hWxEorqvPZpTTS8YPxgOXIg==" serie="A" subTotal="274646.12" tipoDeComprobante="ingreso" total="318589.50" version="3.2" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.sat.gob.mx/ventavehiculos http://www.sat.gob.mx/sitio_internet/cfd/ventavehiculos/ventavehiculos11.xsd">
noExterior="400B" noInterior="P3" pais="MEXICO" />
<cfdi:ExpedidoEn pais="Mexico" referencia="AA000771139" />
<cfdi:RegimenFiscal Regimen="Régimen General de las Personas Morales" />
</cfdi:Emisor>
<cfdi:Conceptos>
<cfdi:Concepto cantidad="1.00" descripcion="SASASA" importe="270505.28" noIdentificacion="9991239999ZH" unidad="EA" valorUnitario="270505.28">
<cfdi:ComplementoConcepto>
<ventavehiculos:VentaVehiculos ClaveVehicular="0520809" Niv="2T3ZFREV7HW384929 " version="1.1">
<ventavehiculos:InformacionAduanera aduana="Eagle Pass" fecha="2017-06-19" numero="172736007007111" />
</ventavehiculos:VentaVehiculos>
</cfdi:ComplementoConcepto>
</cfdi:Concepto>
</cfdi:Conceptos>
<cfdi:Impuestos totalImpuestosTrasladados="43943.38">
<cfdi:Traslados>
<cfdi:Traslado importe="43943.38" impuesto="IVA" tasa="16" />

1 Respuesta

Respuesta
1

Prueba con esto. Me he tropezado con algún problemilla relacionado con la presencia de caracteres ">" en las líneas. No me he parado a pensar en ello y simplemente los he suprimido de la línea que interesa. Si esto diera problemas habría que repensarse el asunto:

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

El procedimiento se basa en buena parte en el tratamiento interno de los parámetros del comando CALL, y en la instrucción SHIFT, creo que poco usada pero de gran potencial. Ya me contarás

Perdón. Acabo de darme cuenta de que no corregí la instrucción fundamental, la que debe hacer el cambio de nombre real. Suelo sustituirla, durante las pruebas, por un ECHO de la instrucción, que me permite ver si la sintaxis es la esperada.

En resumen, debes quitar la palabra "echo" en el comando:

Echo ren %nomarch% "!nuevo!.xml"

para que quede:

ren %nomarch% "!nuevo!.xml"

Buen día estimado gggirald

He intentado generar el bat justo como me lo indicas pero lamentablemente no funciono, es decir no renombra ningún archivo, mira encontré este otro código por internet pero la verdad no se como adecuarlo para que funcione como lo necesito.

set nametmp=%1

set name=%nametmp:~-3%

for %%i in (*.xml) do Find "%1" %%i && ren %%i %name%.xml

Gracias por el poyo y seguimiento al tema.

Revisa lo que has hecho. Como puedes ver en lo que adjunto funciona correctamente en mi entorno:

D:\Carpeta prueba>dir
El volumen de la unidad D es ABR2003
El número de serie del volumen es: 10F6-62F9
 Directorio de D:\Carpeta prueba
03/08/2017  17:57    <DIR>          .
03/08/2017  17:57    <DIR>          ..
10/03/2017  22:38                 8 1-cArta.txt
10/03/2017  22:38                60 10-teclaado.txt
10/03/2017  22:38             2.437 11-bociNa.txt
10/03/2017  22:38             1.705 2-monitor.txt
10/03/2017  22:38               225 21-tacato.txt
10/03/2017  22:38             2.435 3-tururo.txt
10/03/2017  22:38             2.435 3-túrÚro.txt
03/08/2017  08:17             1.118 A-000771139.xml
03/08/2017  08:26             1.363 A-999771139.xml
03/08/2017  08:15             1.340 B-000771139.xml
03/08/2017  15:00               423 papi.bat
              11 archivos         13.549 bytes
               2 dirs  30.779.584.512 bytes libres
D:\Carpeta prueba>type A-000771139.xml
<?xml version="1.0" encoding="UTF-8"?>fecha="2017-07-06T23:46:42" folio="000771139" formaD
ePago="Una sola exhibici¾n" metodoDePago="03" noCertificado="00001000000402850319" 4hWxEor
qvPZpTTS8YPxgOXIg==" serie="A" subTotal="274646.12" tipoDeComprobante="ingreso" total="318
589.50" version="3.2" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.m
x/sitio_internet/cfd/3/cfdv32.xsd http://www.sat.gob.mx/ventavehiculos http://www.sat.gob.
mx/sitio_internet/cfd/ventavehiculos/ventavehiculos11.xsd">
noExterior="400B" noInterior="P3" pais="MEXICO" />
<cfdi:ExpedidoEn pais="Mexico" referencia="AA000771139" />
<cfdi:RegimenFiscal Regimen="RÚgimen General de las Personas Morales" />
</cfdi:Emisor>
<cfdi:Conceptos>
<cfdi:Concepto cantidad="1.00" importe="270505.28" noIdentificacion="0001239999ZH" unidad=
"EA" valorUnitario="270505.28">
<cfdi:ComplementoConcepto>
</ventavehiculos:VentaVehiculos>
</cfdi:ComplementoConcepto>
</cfdi:Concepto>
</cfdi:Conceptos>
<cfdi:Impuestos totalImpuestosTrasladados="43943.38">
<cfdi:Traslados>
<cfdi:Traslado importe="43943.38" impuesto="IVA" tasa="16" />
D:\Carpeta prueba>type papi.bat   <-- Para que se vea el contenido del bat
@echo off
Setlocal EnableDelayedExpansion
for /f %%z in ('dir /b *.xml') do (
   for /f "delims=" %%a in ('find /i "noIdentificacion=" ^< "%%z"') do (
      set linea=%%a
      set linea=!linea:^>=!
      call :tratar "%%z" !linea!
      )
   )
goto :eof
:tratar
set nomarch=%1
:bucle
shift
if "%1"=="noIdentificacion" (
   set nuevo=%~2
   ren %nomarch% "!nuevo!.xml"
   goto :eof
   )
goto :bucle
D:\Carpeta prueba>papi     <----- Aquí se ejecuta el bat
D:\Carpeta prueba>dir
 El volumen de la unidad D es ABR2003
 El número de serie del volumen es: 10F6-62F9
 Directorio de D:\Carpeta prueba
03/08/2017  17:58    <DIR>          .
03/08/2017  17:58    <DIR>          ..
03/08/2017  08:17             1.118 0001239999ZH.xml <-- Renombrado
10/03/2017  22:38                 8 1-cArta.txt
10/03/2017  22:38                60 10-teclaado.txt
10/03/2017  22:38             2.437 11-bociNa.txt
03/08/2017  08:26             1.363 1239999ZH.xml <-- Renombrado
10/03/2017  22:38             1.705 2-monitor.txt
10/03/2017  22:38               225 21-tacato.txt
10/03/2017  22:38             2.435 3-tururo.txt
10/03/2017  22:38             2.435 3-túrÚro.txt
03/08/2017  08:15             1.340 9991239999ZH.xml <-- Renombrado
03/08/2017  15:00               423 papi.bat
              11 archivos 13.549 bytes
               2 dirs 30.779.584.512 bytes libres
D:\Carpeta prueba>

Muéstrame, de forma parecida, cómo lo haces tú. Para copiar el texto de un CMD primero lo marcas en la ventana CMD, luego das Enter, y luego aquí abres un snippet con el icono "<>" de la barra de herramientas de la página.

hola agrego los mismos pasos que tu y este es el resultado, seguro estoy haciendo al mal =(

Creo que ya se cual es el problema... mira anexo el código de uno de los archivos con más información que es con los que me da el error. Me puedes apoyar a realizar la prueba con el contenido de este archivo...

<?xml version="1.0" encoding="UTF-8"?><cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:ventavehiculos="http://www.sat.gob.mx/ventavehiculos" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" LugarExpedicion="México, D.F" NumCtaPago="No Identificado " TipoCambio="No Identificado " certificado="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" fecha="2017-07-04T00:19:49" folio="000770838" formaDePago="Una sola exhibición" metodoDePago="03" noCertificado="00001000000402850319" sello="KJwMS7VFgBAVCSYSxoqoVs+5kLfQYXICZpz1yR9pONGFxemuzvtK7OpgJNxs1MvE/tFauQ5OG2p1waSMoDC+fEhWZ7BT9koVuyD1B/7spe5k1vw7ilkU61dcoi9C/36dSvtDvxmZx7XDZlP5TdQmHAA8l+aRilOvm+k4+U95qxadqmZqy+GYyA/xMK0OI8FNn7BE/9aZiowubMnHOHcxYt6k3/Y3gydRZ2QouABzeZwP5Jbzj4vnDTzl+PjibHTSg5mbwzkfhUC4JJ01TpJ8E42Fy2VVzyzdk1VLDQ3w1wCJBU0pozITNpe7WXM3gaKrp8SUpW8mfytH7Soi9BW2IQ==" serie="A" subTotal="274646.12" tipoDeComprobante="ingreso" total="318589.50" version="3.2" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.sat.gob.mx/ventavehiculos http://www.sat.gob.mx/sitio_internet/cfd/ventavehiculos/ventavehiculos11.xsd">
  <cfdi:Emisor nombre="TOYOTA MOTOR SALES de Mexico S de RL de CV" rfc="TMS010508RX0">
            <cfdi:DomicilioFiscal calle="Paseo de Tamarindos" codigoPostal="05120" colonia="COL. BOSQUES DE LAS LOMAS" estado="DF" localidad="MEXICO D.F." municipio="Cuajimalpa de Morelos" noExterior="400B" noInterior="P3" pais="MEXICO" />
    <cfdi:ExpedidoEn pais="Mexico" referencia="AA000770838" />
        <cfdi:RegimenFiscal Regimen="Régimen General de las Personas Morales" />
     </cfdi:Emisor>
  <cfdi:Receptor nombre="OZ AUTOMOTRIZ S DE RL DE CV" rfc="OAU021125H84">
           <cfdi:Domicilio calle="AV CIRCUNVALACION" codigoPostal="44610" colonia="LOMAS DEL COUNTRY" estado="JAL" localidad="GUADALAJARA" noExterior="1180" pais="MEX" />
     </cfdi:Receptor>
  <cfdi:Conceptos>
     <cfdi:Concepto cantidad="1.00" descripcion="RAV4 4X2 LE SUV L4 2.5L AT 6 v" importe="270505.28" noIdentificacion="2T3ZFREV9HW384950" unidad="EA" valorUnitario="270505.28">
      <cfdi:ComplementoConcepto>
<ventavehiculos:VentaVehiculos ClaveVehicular="0520809" Niv="2T3ZFREV9HW384950  " version="1.1">
<ventavehiculos:InformacionAduanera aduana="Eagle Pass" fecha="2017-06-16" numero="172736007007110" />
</ventavehiculos:VentaVehiculos>
</cfdi:ComplementoConcepto>
</cfdi:Concepto>
</cfdi:Conceptos>
  <cfdi:Impuestos totalImpuestosTrasladados="43943.38">
            <cfdi:Traslados>
                  <cfdi:Traslado importe="43943.38" impuesto="IVA" tasa="16" />
           </cfdi:Traslados>
    </cfdi:Impuestos>
  <cfdi:Complemento>
    <tfd:TimbreFiscalDigital FechaTimbrado="2017-07-04T13:06:25" UUID="6752CADB-7D2C-46B5-BBA9-D03BF4A8C204" noCertificadoSAT="00001000000300494998" selloCFD="KJwMS7VFgBAVCSYSxoqoVs+5kLfQYXICZpz1yR9pONGFxemuzvtK7OpgJNxs1MvE/tFauQ5OG2p1waSMoDC+fEhWZ7BT9koVuyD1B/7spe5k1vw7ilkU61dcoi9C/36dSvtDvxmZx7XDZlP5TdQmHAA8l+aRilOvm+k4+U95qxadqmZqy+GYyA/xMK0OI8FNn7BE/9aZiowubMnHOHcxYt6k3/Y3gydRZ2QouABzeZwP5Jbzj4vnDTzl+PjibHTSg5mbwzkfhUC4JJ01TpJ8E42Fy2VVzyzdk1VLDQ3w1wCJBU0pozITNpe7WXM3gaKrp8SUpW8mfytH7Soi9BW2IQ==" selloSAT="c8oXYiAt+MSrR2zrrhy5syEaiKCa8Ga9Gmqg4eqq8EUKehIkbqoGntS5Zh6taBYOxnPyMJIazC1fglyugaOALcgZW34gY/gwvrjLw2Pkxvbo0lus0vDlv0jOrJWsGdS/RpnrbvxRVdCl4PrBVIitJIZgV0sRQEWoxTMaeIjrTaU=" version="1.0" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/TimbreFiscalDigital/TimbreFiscalDigital.xsd" xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" />
  </cfdi:Complemento>
</cfdi:Comprobante>

Efectivamente, ese es el problema. Y a ver si esto es la solución: añade la línea:

      set linea=!linea:"=!

entre estas dos:

      set linea=!linea:^>=!
      call :tratar "%%z" !linea!

de esta manera se evita el trato especial que se hace a las comillas y los valores separados por espacio que figuran entrcomillados se tratan como parámetros de la CALL.

Y puesto que ya se eliminan las comillas antes de hacer la CALL no es necesario limpiarlas en la propia rutina, de modo que se puede sustituir el comando/instrucción:

   set nuevo=%~2

por:

   set nuevo=%2

He encontrado otra solución que me parece "más elegante". Consiste en quitar también las comillas al primer parámetro (relativo), es decir, en lugar de:

if "%1"=="noIdentificacion" (

poner:

if "%~1"=="noIdentificacion" (

Lógicamente esta solución se aplica al bat original, es decir que no hay que hacer las modificaciones anteriores, sobre todo la última.

Muchísimas gracias mi estimado, ya quedo funcionando con la ultima modificación que me pasaste, tenia más de una semana con este dolor de cabeza pero por fin ha quedado.

Saludos cordiales.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas