[VBS] Supprimer un bloc de lignes

Supprimer un bloc de lignes [VBS] - VB/VBA/VBS - Programmation

Marsh Posté le 07-01-2011 à 11:06:50    

Bonjour,

 

je veux supprimer dans un fichier ini, un bloc de lignes donc la première commence par une section et la dernière est une ligne vide.

 

J'ai déjà fait ce morceau de script qui permet de supprimer une ligne en particulier :

Code :
  1. Const ForReading = 1
  2. Const ForWriting = 2
  3. Set objFSO = CreateObject("Scripting.FileSystemObject" )
  4. Set objFile = objFSO.OpenTextFile("D:\script\simul.txt", ForReading)
  5. Do Until objFile.AtEndOfStream
  6.     strLine = objFile.ReadLine
  7.     If InStr(strLine, "ligne a supprimer" ) = 0 Then
  8.         strNewContents = strNewContents & strLine & vbCrLf
  9.     End If
  10. Loop
  11. objFile.Close
  12. Set objFile = objFSO.OpenTextFile("D:\script\simul.txt", ForWriting)
  13. objFile.Write strNewContents
  14. objFile.Close
 

Maintenant, comment supprimer un "bloc"? Dans le fichier INI suivant, je veux supprimer tout ce qui concerne la section Office 2007 :

Code :
  1. [Office 2007]
  2. UPDATED0001=patch 001
  3. UPDATED0002=Update files
  4. UPDATED0003=Excel 2007
  5. UPDATED0005=Access 2007
  6. [Symantec Antivirus 9.03]
  7. INSTALL=Symantec Antivirus 9.03
  8. UPDATED0001=Uninstall previous Antivirus version
  9. UPDATED0002=Install Symantec Antivirus 9.03
 

En gros, je voudrais traduire en code : Je trouve la section Office 2007, tant que la ligne en cours de lecture n'est pas vide, je la supprime.

 


Merci de votre aide. :)


Message édité par slr56 le 07-01-2011 à 13:45:44
Reply

Marsh Posté le 07-01-2011 à 11:06:50   

Reply

Marsh Posté le 07-01-2011 à 13:45:54    

up s'il vous plait.

Reply

Marsh Posté le 07-01-2011 à 13:58:52    

Un truc du genre ?

Code :
  1. prendre = vrai
  2. tant que pas fin du fichier:
  3.   lire ligne
  4.   si ligne = entete de bloc recherchée:
  5.     prendre = faux
  6.   si prendre:
  7.     ecriture de la ligne
  8.   sinon:
  9.     si ligne vide:
  10.       prendre = vrai

Message cité 1 fois
Message édité par gzii le 07-01-2011 à 14:00:10
Reply

Marsh Posté le 07-01-2011 à 14:24:06    

gzii a écrit :

Un truc du genre ?

Code :
  1. prendre = vrai
  2. tant que pas fin du fichier:
  3.   lire ligne
  4.   si ligne = entete de bloc recherchée:
  5.     prendre = faux
  6.   si prendre:
  7.     ecriture de la ligne
  8.   sinon:
  9.     si ligne vide:
  10.       prendre = vrai



 
Oui. C'est ça.

Reply

Marsh Posté le 07-01-2011 à 14:27:04    

Ben je crois que tu as tous les éléments. Pour le langage je ne peux pas te renseigner, pas envie d'apprendre le VBS.

Reply

Marsh Posté le 07-01-2011 à 14:43:48    

Pour supprimer une ligne, il n'y a pas de problème. En revanche, je ne vois pas comment dire à partir de la ligne que j'ai trouvé (la ligne de début de bloc), supprimer toutes les lignes (première de bloc incluse) jusqu'à la prochaine ligne vide.


Message édité par slr56 le 07-01-2011 à 14:44:16
Reply

Marsh Posté le 07-01-2011 à 14:45:19    

une variable booléenne prendre que tu mets à vrai ou faux comme ce que je t'ai dit, et à vrai en tout début.


Message édité par gzii le 07-01-2011 à 14:45:37
Reply

Marsh Posté le 07-01-2011 à 19:52:52    

Je suis rendu à ça mais malheureusement, ça ne fonctionne toujours pas. Ca supprime tout les lignes de mon fichier. Comment ne supprimer que la portion suivante :
 
[Office 2007]
UPDATED0001=patch 001
UPDATED0002=Update files
UPDATED0003=Excel 2007
UPDATED0005=Access 2007
 

Code :
  1. Const ForWriting = 2
  2. take = false
  3. Set objFSO = CreateObject("Scripting.FileSystemObject" )
  4. Set objFile = objFSO.OpenTextFile("fichier.ini" )
  5. While Not objFile.AtEndOfStream
  6.     strLine = objFile.ReadLine
  7.     If InStr(strLine, "Symantec Antivirus" ) = 0 Then
  8. take = true
  9. End if
  10. If take = true then
  11.  Set objFile = objFSO.OpenTextFile("fichier.ini", ForWriting)
  12.  Do While strLine <> ""
  13.    strLine = ""
  14.  Loop
  15.  objFile.Close
  16. End if
  17. take = false
  18. Wend
  19. objFile.Close
  20. Set objFile = Nothing



Message édité par slr56 le 07-01-2011 à 19:55:07
Reply

Marsh Posté le 08-01-2011 à 02:52:14    

C'est pas du tout ce que j'ai écrit.
Pourquoi tu ouvres et tu fermes ton fichier plein de fois ?
 
C'est quoi ce truc ?!! :lol:
Je n'ai pas l'impression que tu comprennes ce que tu fais là. Si ?

Reply

Marsh Posté le 08-01-2011 à 13:57:56    

La prog n'a jamais été mon fort. ^^
Ce qu'il faut, c'est que j'ouvre le fichier en lecture pour mettre le curseur sur le titre de la section que je cherche et ensuite que je passe en mode écriture pour supprimer les lignes dont je ne veux plus.
 
Or ce n'est pas ça que j'ai fait.
 
Où faut-t-il que j'ouvre le fichier en écriture pour faire les modifications nécessaires?

Reply

Marsh Posté le 08-01-2011 à 13:57:56   

Reply

Marsh Posté le 08-01-2011 à 14:14:29    

Tu lis un fichier et en écris un qui remplace le premier.
Donc il faudrait, comme dans le premier programme, stocker ce que tu lis et que tu veux dans une variable, et à la fin l'écrire dans le fichier. Ça ça ne change pas.
quand j'ai mis écriture de la ligne, c'est plutôt ajout de la ligne dans la variable.
 
Maintenant, je pense que ce serait pas mal que tu reviennes un peu en arrière pour apprendre les bases.


Message édité par gzii le 08-01-2011 à 14:15:55
Reply

Marsh Posté le 13-01-2011 à 09:55:54    

Bonjour,

 

je reviens sur ce sujet car j'ai réussi à faire le script que je voulais. Cependant, je voudrais l'optimiser.

Code :
  1. strComputer = "."
  2. Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2" )
  3. Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem",,48)
  4. For Each objItem in colItems
  5. os_version = os_version & objItem.version
  6. Next
  7. If InStr(1,os_version,"6.1" ) then
  8. strFileName = "C:\Program Files\infos\fichier1.ini"
  9. Else If InStr(1,os_version,"5.1" ) then
  10.  strFileName = "C:\Program Files\infos\fichier2.ini"
  11. End If
  12. End If
  13. 'Delete Lines of a Text File Beginning
  14. set objWS = CreateObject("Wscript.Shell" )
  15.      
  16.         Set fsob=CreateObject("Scripting.FileSystemObject" )
  17. Const FOR_READING = 1
  18. Const FOR_WRITING = 2
  19. strCheckForString0 = UCase("" )
  20. strCheckForString1 = UCase("" )
  21. strCheckForString2 = UCase("" )
  22. Set objFS = CreateObject("Scripting.FileSystemObject" )
  23. Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
  24. strContents = objTS.ReadAll
  25. objTS.Close
  26. arrLines = Split(strContents, vbNewLine)
  27. Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)
  28. For Each strLine In arrLines
  29.   If Not(Left(UCase(LTrim(strLine)),Len(strCheckForString0)) = strCheckForString0) Then 
  30.      objTS.WriteLine strLine
  31.   End If
  32. Next
  33. set objFS=nothing
  34. Set objTS=nothing
  35. Set arrLines=nothing
  36. Set strCheckForString0=nothing
  37. Set objFS = CreateObject("Scripting.FileSystemObject" )
  38. Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
  39. strContents = objTS.ReadAll
  40. objTS.Close
  41. arrLines = Split(strContents, vbNewLine)
  42. Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)
  43. For Each strLine In arrLines
  44.   If Not(Left(UCase(LTrim(strLine)),Len(strCheckForString1)) = strCheckForString1) Then 
  45.      objTS.WriteLine strLine
  46.   End If
  47. Next
  48. set objFS=nothing
  49. Set objTS=nothing
  50. Set arrLines=nothing
  51. Set strCheckForString1=nothing
  52. Set objFS = CreateObject("Scripting.FileSystemObject" )
  53. Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
  54. strContents = objTS.ReadAll
  55. objTS.Close
  56. arrLines = Split(strContents, vbNewLine)
  57. Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)
  58. For Each strLine In arrLines
  59.   If Not(Left(UCase(LTrim(strLine)),Len(strCheckForString2)) = strCheckForString2) Then 
  60.      objTS.WriteLine strLine
  61.   End If
  62. Next
  63. set objFS=nothing
  64. Set objTS=nothing
  65. Set arrLines=nothing
  66. Set strCheckForString2=nothing
 

Le soucis est qu'à chaque nouvelle chaine que je veux supprimer, je dois créer une portion de code identique à celle qui est en bleue. Y'aurait-il moyen de faire un tableau de variables (1 variable = 1 chaine StrCheckForString) afin de faire une boucle for?

 

Si oui, comment? Dans certain cas, j'aurai 2 chaines StrCheckForString, dans d'autres j'aurai 5 chaines.. Ce n'est jamais fixe.


Message édité par slr56 le 13-01-2011 à 10:04:40
Reply

Marsh Posté le 13-01-2011 à 10:46:18    

Alors tu met ton fic de départ dans une variable et tu fais ton bloc qui écrit dans une autre, et à la fin remet le nouveau contenu dans la première, et tourne sur un foreach de ton tableau de blocs à supprimer, ou un truc du genre.
Je ne vois pas ce qui te bloque, éventuellement reprend les bases comme je te l'ai déjà dit.
n fois le même bloc de code ça ne se fait pas.

Message cité 1 fois
Message édité par gzii le 13-01-2011 à 10:47:58
Reply

Marsh Posté le 13-01-2011 à 11:16:01    

gzii a écrit :

Alors tu met ton fic de départ dans une variable et tu fais ton bloc qui écrit dans une autre, et à la fin remet le nouveau contenu dans la première, et tourne sur un foreach de ton tableau de blocs à supprimer, ou un truc du genre.
Je ne vois pas ce qui te bloque, éventuellement reprend les bases comme je te l'ai déjà dit.
n fois le même bloc de code ça ne se fait pas.


 
n fois le même bloc de code ça ne se fait pas. Je le sais et c'est bien pour ça que je demande. Mais comme je le dis, dès fois j'aurai 3 lignes, dès fois 4 dès fois plus. Donc je ne peux pas faire une boucle, si?

Reply

Marsh Posté le 13-01-2011 à 11:47:38    

Si, reprend tout depuis le début, là à mon avis tu essaies de copier du code sans trop y comprendre.
Regarde le foreach par exemple sur une doc. Là tu l'utilises déjà.


Message édité par gzii le 13-01-2011 à 11:48:14
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed