elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Consulta Batch encuentra archivo XML por contenido y modifica linea
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta Batch encuentra archivo XML por contenido y modifica linea  (Leído 3,179 veces)
chepem2

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Consulta Batch encuentra archivo XML por contenido y modifica linea
« en: 31 Enero 2014, 17:18 pm »

Hola a todos!

Bien pues tengo esta pequeña interrogante: Estoy interesado en hacer un batch que me busque un archivo xml en la carpeta donde se guardan los archivos de confirguracion de las WIFI en win 7, la idea basicamente es poder encontrar el archivo no por el nombre del mismo, sino porque en una determinada linea del codigo que contiene se encuentra el nombre de la red (linea 7), a continuacion despues de encontrarlo necesito cambiar el contenido de la linea donde se encuentra la contraseña cifrada (linea 22), para esto estoy probando codigo que encontré en otro thread del foro:

Código:
@echo off
(
echo 22
echo <keyMaterial>Hola</keyMaterial>
echo w
echo e
) | edlin /b {B379EDC0-8C8F-457A-8125-86D1FAA1A03F}.xml

donde {B379EDC0-8C8F-457A-8125-86D1FAA1A03F}.xml es el nombre del archivo, claro esto es solo de prueba puesto que la intencion es que no lo encuentre por nombre sino por lo que contiene la linea 7 del mismo.

Deseo realizarlo de esta manera ya que la finalidad de este batch es la de modificar las contraseñas de las computadoras de una pequeña empresa, donde sino se hace de esta manera tendría que modficarse una por una todas las computadoras.

saludos y les agradezco de antemano.


« Última modificación: 31 Enero 2014, 19:04 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Consulta Batch encuentra archivo XML por contenido y modifica linea
« Respuesta #1 en: 31 Enero 2014, 19:45 pm »

Hola

Si estás seguro de que el número de lineas y el contenido nunca va a cambiar en ese archivo XML pues... entonces la solución que has pensado es viable, aunque no me parece la mejor solución, yo te recomendaría utilizar la aplicación XMLStarlet que sirve precísamente para la edición de archivos XML, aunque óbviamente deberás tratar el archivo como un archivo XML indicando el namespace el attributo a modificar y etc.

Por otro lado Batch es muy feo y lento, muy poco óptimo para estas tareas de procesamiento, te propongo una solución mejor utilizando VBS (El intérprete ya viene con Windows así que no tienes que instalar software en la empresa):

NOTA: Asegúrate de que la codificación de los archivos XML sea ANSI.

Código
  1. ' El Objeto 'FileSystemObject'.
  2. Set FSO        = CreateObject("Scripting.FileSystemObject")
  3.  
  4. Directory      = ".\"             ' El directorio donde guardas los archivos.
  5. FileExt        = "xml"            ' La extensión de los archivos a escanear.
  6. LineToScan     = 7                ' La linea para identificar el archivo.
  7. TextToMatch    = "Something"      ' El texto que buscar en la linea a examinar.
  8. LineToReplace  = 22               ' El número de la linea a reemplazar.
  9. TextToReplace  = "<New Password>" ' El nuevo texto de la linea a reemplazar.
  10.  
  11. ' Recorro los archivos del directorio 'Directory'.
  12. For Each File In FSO.GetFolder(Directory).Files
  13.  
  14. ' Si la extensión del archivo es igual que 'FileExt'...
  15. If LCase(FSO.GetExtensionName(File)) = LCase(FileExt) Then
  16.  
  17. ' Creo un Array con el contenido del archivo (las lineas de texto).
  18. Lines = Split(FSO.OpenTextFile(File, 1).ReadAll(), vbcrlf)
  19.  
  20. ' Si la cantidad de elementos del Array (lineas) es igual o mayor que 'LineToReplace';
  21. ' y si además el texto de la linea 'LineToScan' es igual a 'TextToMatch'...
  22. If (uBound(Lines) => (LineToReplace -1)) And _
  23.   (LCase(Lines(LineToScan - 1)) = LCase(TextToMatch)) Then
  24.  
  25. ' Reemplazo la linea 'LineToReplace' por el texto 'TextToReplace'.
  26. Lines(LineToReplace -1) = TextToReplace
  27.  
  28. ' Reemplazo el archivo original, con los cambios realizados.
  29. FSO.CreateTextFile(File, 2).Write(Join(Lines, vbcrlf))
  30.  
  31. '' ...O Creo un nuevo documento en la misma carpeta del archivo original, con los cambios realizados.
  32. ' FSO.CreateTextFile(FSO.GetBaseName(File) & ".tmp", 2).Write(Join(Lines, vbcrlf))
  33.  
  34. ' Detengo la iteración de los elementos, salgo del búcle.
  35. Exit For ' // Each File In FSO.GetFolder(Directory).Files
  36.  
  37. End If ' // (uBound(Lines) => (LineToReplace -1)) And (LCase(Lines(LineToScan - 1)) = LCase(TextToMatch))
  38.  
  39. End If ' // LCase(FSO.GetExtensionName(File)) = LCase(FileExt)
  40.  
  41. Next ' // File
  42.  
  43. Wscript.Quit(0) ' Salisa exitosa: '0'
  44.  

Modifícalo a tus necesidades,
Saludos!


« Última modificación: 31 Enero 2014, 22:04 pm por Eleкtro » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines