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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [VBS] Detectar nombre en renombrado masivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [VBS] Detectar nombre en renombrado masivo  (Leído 1,689 veces)
ovichan

Desconectado Desconectado

Mensajes: 81


Ver Perfil
[VBS] Detectar nombre en renombrado masivo
« en: 28 Julio 2015, 00:04 am »

Hola, lo que quiero hacer prácticamente ya está hecho, sólo me falta hacer la tarea algo más inteligente al detectar si un nomobre ya existe para evitar que por ejemplo si quiero cambiar "Luis" por "José Luis" provoque "José José Luis".

La base es tirar de un txt, donde habrá un listado por líneas, en cada cual habrá un par de palabras, indicando la palabra a cambiar y la nueva palabra: Luis-José Luis.

Código:

Código
  1. Option Explicit
  2.  
  3. Dim fso, fso2, strNombreAnterior, StrNombreNuevo, RutaNombres, RutaArchivo, ListaArchivos, Archivo, strContenidoAnterior, strContenidoNuevo, NombresFila, FilaPartida,objFile,value, word
  4.  
  5. Set fso=CreateObject("Scripting.FileSystemObject")
  6. Set fso2=CreateObject("Scripting.FileSystemObject")
  7. Const Lectura = 1
  8. Const Escritura = 2
  9.  
  10.  
  11. RutaNombres="C:\Users\Isra\Desktop\lista.txt"
  12. RutaArchivo="C:\Users\Isra\Desktop\Prueba.txt"
  13.  
  14. 'Establecemos los objetos
  15. Set ListaArchivos = fso.OpenTextFile(RutaNombres,Lectura)
  16. Set Archivo=fso2.OpenTextFile(RutaArchivo,Lectura)
  17.  
  18. 'Leemos el archivo a modificar
  19. strContenidoNuevo=Archivo.ReadAll
  20.  
  21. Archivo.close
  22.  
  23. Set objFile = fso.OpenTextFile(RutaArchivo, Escritura)
  24.  
  25.  
  26. 'Lee línea por línea para saber los valores a modificar en un archivo de texto
  27. Do Until ListaArchivos.AtEndOfStream
  28. 'Lee la línea entera
  29. NombresFila = ListaArchivos.ReadLine
  30.  
  31. 'Partimos la línea asignando cada valor a un array
  32. FilaPartida=split(NombresFila ,"-")
  33.  
  34. 'Asignamos a cada variable su valor del array por línea
  35. strNombreAnterior=Trim(cstr(FilaPartida(0)))
  36. strNombreNuevo=Trim(cstr(FilaPartida(1)))
  37.  
  38. 'Comprobamos valores
  39. 'wscript.echo strNombreAnterior
  40. 'wscript.echo strNombreNuevo
  41. value = InStr(strContenidoNuevo, strNombreNuevo)
  42. 'wscript.echo value
  43. [color=red]if value <> 1 then [/color]
  44. strContenidoNuevo=Replace(strContenidoNuevo, strNombreAnterior, strNombreNuevo,1,-1,0)
  45. [color=red]end if [/color]
  46. Loop
  47.  
  48. 'wscript.echo strContenidoNuevo
  49. ListaArchivos.close
  50.  
  51. objFile.WriteLine strContenidoNuevo
  52. objFile.Close

El problema con value = InStr(strContenidoNuevo, strNombreNuevo) es que al detecta que existe ya no interpreta ninguna otra más con el nombre StrNombreNuevo. Si quito la parte en rojo, cada vez que ejecute los nombres compuesto iran ganando el primer nombre reitativamente.

Pensé en hacer un bucle tal que:
Código
  1. for each word in split(strContenidoNuevo, "")
  2. value = InStr(strContenidoNuevo, strNombreNuevo)
  3. 'wscript.echo value
  4. [color=red]if value <> 1 then [/color]
  5. strContenidoNuevo=Replace(strContenidoNuevo, strNombreAnterior, strNombreNuevo,1,-1,0)
  6. [color=red]end if [/color]
  7. next
  8.  

Sin embargo, el resultado no es el esperado. Imagino que será una trivialidad pero ahora mismo estoy ofuscado ^^'. Gracias.


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