Modifier une chaine de caractères dans tous les scripts du répertoire courant

Résolu
Signaler
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008
-
Messages postés
4
Date d'inscription
vendredi 29 septembre 2006
Statut
Membre
Dernière intervention
19 juillet 2010
-
Bonjour,


j'aurais aimé savoir s'il était possible et comment faire un script du genre:
<li>une input box dans laquelle on renseigne une chaine de caractères</li><li>une input box dans laquelle on renseigne une nouvelle chaine de caractères</li><li>le script test chaque script du dossier courant et remplace la première chaine par la nouvelle si elle est présente.</li>
Idéal quand on a renommé ou déplacé un partage réseau....

Du genre modification de tous les scripts du répertoire sysvol

Merci beaucoup d'avance!!

20 réponses

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonjour à tous....

Script en VBS, que je viens de créér (et tester):

Option Explicit
Dim Saisie1, Saisie2
Saisie1 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Quelle chaine de caractères" &_
          "voulez-vous remplacer ???","Modification de script", "ligne")
If Saisie1 = "" Then WScript.Quit



Saisie2 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Par quelle chaine de caractères" &_
          "voulez-vous remplacer la chaine " & Saisie1 &_
          " ???","Modification de script", "JMO")
If Saisie2 = "" Then WScript.Quit



Const ForReading 1, ForWriting 2, ForAppending = 8
Dim fso, Dossiers, f, fichier, fichiers, i, strtmp, Resultat
Set fso = CreateObject("Scripting.FileSystemObject")
Set Dossiers = fso.GetFolder(GetPath)
Set fichiers = Dossiers.Files



'pour chaque fichier de mon objet fichiers de mon objet fso...:)
For Each fichier in fichiers
   If fso.GetExtensionName(fichier) = "txt" Then
'     MsgBox "verif fichier  " & GetPath & fichier.Name



   Dim objTextStream
   Set objTextStream = Fso.OpenTextFile(GetPath & fichier.Name, ForReading)
   Resultat = objTextStream.ReadAll



   strtmp = split(Resultat,"")
   For i = 0 to Ubound(strtmp)
       If instr(trim(strtmp(i)),Saisie1) Then
'          MsgBox "le fichier " & fichier.Name & "  contient" &vbCrLf& strtmp(i)
           strtmp(i) = Replace(strtmp(i), Saisie1, Saisie2)
'          MsgBox "strtmp(i) de " & fichier.Name & "  contient maintenant " &vbCrLf& strtmp(i)
       End If
       objTextStream.Close
       Set objTextStream = Fso.OpenTextFile(GetPath & fichier.Name, ForWriting, True)
       objTextStream.Write strtmp(i) 
   Next
   objTextStream.Close
   End If
Next



'Fonction de récupération du répertoire courant
Function GetPath()
Dim path
path = WScript.ScriptFullName
GetPath = Left(path, InStrRev(path, ""))
End Function



Set objTextStream = Nothing
Set f = Nothing
Set fso = Nothing
MsgBox "Modifications terminées !!!"

jean-marc
Messages postés
630
Date d'inscription
samedi 15 février 2003
Statut
Modérateur
Dernière intervention
9 octobre 2011
1
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Merci, pas mal du tout en effet!! J'aurais préféré du VBScript...
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Bonjour,


Mille merci Jean-Marc ça marche super et quelque soit l'extension, a condition de la modifier ici biensûr...:


                If fso.GetExtensionName(fichier) = "txt"

Je donne 10/10, simple, rapide, efficace, la grande classe!!!

Voilà qui peut être utile à beaucoup de monde...
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

j'ai adapté avec mes InputBox (j'y tiens... ) et voilà ce que ça donne:




Option Explicit

Dim Saisie1, Saisie2, Saisie3

Saisie1 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Quelle chaine de caractères" &_

          " voulez-vous remplacer ???","Modification de script", "ligne")

If Saisie1 = "" Then WScript.Quit


Saisie2 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Par quelle chaine de caractères" &_

          " voulez-vous remplacer la chaine " & Saisie1 &_

          " ???","Modification de script", "nouvelle ligne")

If Saisie2 = "" Then WScript.Quit


Saisie3 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Pour quelle extension de fichier" &_

          " voulez-vous remplacer la chaine " & Saisie1 &_

          " ???","Modification de script", "txt")

If Saisie3 = "" Then WScript.Quit


Const ForReading 1, ForWriting 2, ForAppending = 8

Dim fso, Dossiers, f, fichier, fichiers, i, strtmp, Resultat

Set fso = CreateObject("Scripting.FileSystemObject")

Set Dossiers = fso.GetFolder(GetPath)

Set fichiers = Dossiers.Files


'pour chaque fichier de mon objet fichiers de mon objet fso...:)

For Each fichier in fichiers

   If fso.GetExtensionName(fichier) = Saisie3 Then


   Dim objTextStream

   Set objTextStream = Fso.OpenTextFile(GetPath & fichier.Name, ForReading)

   Resultat = objTextStream.ReadAll


   strtmp = split(Resultat,"")

   For i = 0 to Ubound(strtmp)

       If instr(trim(strtmp(i)),Saisie1) Then

           strtmp(i) = Replace(strtmp(i), Saisie1, Saisie2)

       End If

       objTextStream.Close

       Set objTextStream = Fso.OpenTextFile(GetPath & fichier.Name, ForWriting, True)

       objTextStream.Write strtmp(i)

   Next

   objTextStream.Close

   End If

Next


'Fonction de récupération du répertoire courant

Function GetPath()

Dim path

path = WScript.ScriptFullName

GetPath = Left(path, InStrRev(path, ""))

End Function


Set objTextStream = Nothing

Set f = Nothing

Set fso = Nothing

MsgBox "Modifications effectuées !!!", vbInformation

Encore une fois, un million de mercis!!
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonjour,

Et pourquoi pas rajouter une inputbox pour le choix du répertoire...ou
proposer un CommanDialog (plus joli !!!)

jean-marc
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Bonjour,


pas bête du tout ça ma fois, j'y pense...
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Bonjour,


j'ai bien trouvé ça pour le CommonDialog mais je ne vois pas comment 'lutiliser dans le code ci-dessus....


Set objDialog = CreateObject("UserAccounts.CommonDialog")

objDialog.Filter = "VBScript |*.vbs|Java Script| *.js|Batch| *.bat|Fichiers Texte| *.txt |Tous types|*.*"

objDialog.Flags = &H0200

objDialog.FilterIndex = 1

objDialog.InitialDir = "C:"

intResult = objDialog.ShowOpen


If intResult = 0 Then

    Wscript.Quit

Else

    Wscript.Echo objDialog.FileName

End If
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Bonjour,

voilà un CommonDialog mieux adapté encore mais je ne trouve pas le moyen de l'intégrer à ton Script JMO...
strFile renvoie le chemin complet du fichier, le nom et l'extension.

On peut sélectionner plusieurs fichiers en maintenant appuyé sur Ctrl

Quelqu'un aurait une idée???




'affiche une boite de dialogue à choix multiples

'*****valable uniquement sur XP*****

Dim objDialog, intResult, arrFiles, strFile

Set objDialog = CreateObject("UserAccounts.CommonDialog")

objDialog.Filter = "VBScript |*.vbs|Java Script| *.js|Batch| *.bat|Fichiers Texte| *.txt |Tous les fichiers|*.*"

objDialog.Flags = &H0200

objDialog.FilterIndex = 1

objDialog.InitialDir = "C:"

intResult = objDialog.ShowOpen


If intResult = 0 Then

    Wscript.Quit

Else

    arrFiles = Split(objDialog.FileName, " ")

    For i = 1 to Ubound(arrFiles)

        strFile = arrFiles(0) & arrFiles(i)

        WScript.Echo strFile

    Next

End If
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Bon bin en fait, je pense avoir trouvé la solution tout seul ....

Dites-moi si vous voyez des erreurs ou des maladresses, je ne suis pas encore au top sur VBS... En tous cas, ça fonctionne !!!

'---------------------------------------

'Remplace une valeur par une autre

'pour tous les fichiers selectionnés

'---------------------------------------


Option Explicit

Dim Saisie1, Saisie2

Saisie1 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Quelle chaine de caractères" &_

          " voulez-vous remplacer ???","Modification de script", "ligne")

If Saisie1 = "" Then WScript.Quit


Saisie2 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Par quelle chaine de caractères" &_

          " voulez-vous remplacer la chaine " & Saisie1 &_

          " ???","Modification de script", "nouvelle ligne")

If Saisie2 = "" Then WScript.Quit


MsgBox vbCrLf&"Choisissez maintenant tous les fichiers" &_

          vbCrLf&"pour lesquels vous voulez remplacer la chaine:" &_

      vbCrLf&Saisie1, vbExclamation, "Modification de script"


Const ForReading 1, ForWriting 2, ForAppending = 8

Dim fso, i, j, strtmp, Resultat

Set fso = CreateObject("Scripting.FileSystemObject")


'affiche une boite de dialogue à choix multiples

'*****valable uniquement sur XP*****

Dim objDialog, intResult, arrFiles, strPath, strFile

Set objDialog = CreateObject("UserAccounts.CommonDialog")

objDialog.Filter = "VBScript |*.vbs|Java Script| *.js|Batch| *.bat|Fichiers Texte| *.txt |Tous les fichiers|*.*"

objDialog.Flags = &H0200

objDialog.FilterIndex = 1

objDialog.InitialDir = "C:"

intResult = objDialog.ShowOpen


If intResult = 0 Then

    Wscript.Quit

Else

    arrFiles = Split(objDialog.FileName, " ")

    For i = 1 to Ubound(arrFiles)

        strPath = arrFiles(0)

        strFile = arrFiles(i)

           Dim objTextStream

           Set objTextStream = Fso.OpenTextFile(strPath & strFile, ForReading)

           Resultat = objTextStream.ReadAll

           strtmp = split(Resultat,"")

            For j = 0 to Ubound(strtmp)

                If instr(trim(strtmp(j)),Saisie1) Then

           
        strtmp(j) = Replace(strtmp(j),
Saisie1, Saisie2)

                End If

                objTextStream.Close

           
    Set objTextStream = Fso.OpenTextFile(strPath &
strFile, ForWriting, True)

                objTextStream.Write strtmp(j)

                objTextStream.Close

            Next

    Next

End If


Set objTextStream = Nothing

Set fso = Nothing

MsgBox "Modifications effectuées !!!", vbInformation, Now()
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonjour,

440681 Hitch16 , test négatif at home.
Aucune modif effectuée.
- attention aux fichiers dont le nom contient des spaces
- à la fin, rajoute un Set objDialog = Nothing pour libérer l'objet

jean-marc
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Bonjour,

Entièrement d'accord avec toi JMO, j'avais essayé avec du texte mais pas avec du vbs!!!

Et, comme toi, pas de modif sur les scripts....

Mauvaise procédure de test pour validation

Cherchez l'erreur
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

En fait, si j'avais vérifié mais pour un lot de script et ça fonctionnait (pas encore trop reveillé ce matin...).

J'ai testé ce matin fichier par fichier et rien ne se passe, comme tu dis.

Après un café et un peu de réflexion, je reteste avec plusieurs fichiers et ça fonctionne.

Donc le problème vient du traitement fichier par fichier mais pas par lot...

En remplaçant "For i 1 to Ubound(arrFiles)" par "For i 0 to Ubound(arrFiles)" ça marche!!!

Je te laisse tester, et tous ceux qui veulent...

Merci pour tout
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonjour,

Rajoute des MsgBox pour tes tests.
J'ai selectionné un fichier.vbs  => c'est tout faux !!!!
strPath = StrFile donc
           Dim objTextStream
           Set objTextStream = Fso.OpenTextFile(strPath & strFile, ForReading)
ne peut pas fonctionner .....

    arrFiles = Split(objDialog.FileName, " ")
    For i = 0 to Ubound(arrFiles)
        Dim cpt, liste
        strPath = arrFiles(0)
        strFile = arrFiles(i)
        MsgBox strPath &    "      "  & strFile

Bon courage.
jean-marc
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Oui, oui, oui, oui, oui!!

Je le suis effectivement rendu compte de mon erreur et je l'ai déjà corrigé mais pas mentionné.

Cela dit, maintenant ça fonctionne... (jusqu'à preuve du contraire).




Option Explicit

Dim Saisie1, Saisie2

Saisie1 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Quelle chaine de caractères" &_

          " voulez-vous remplacer ???","Modification par lot", "ligne")

If Saisie1 = "" Then WScript.Quit


Saisie2 = InputBox(vbCrLf&vbCrLf&vbCrLf&vbCrLf&"Par quelle chaine de caractères" &_

          " voulez-vous remplacer la chaine " & Saisie1 &_

          " ???","Modification par lot", "nouvelle ligne")

If Saisie2 = "" Then WScript.Quit


MsgBox vbCrLf&"Choisissez maintenant tous les fichiers" &_

          vbCrLf&"pour lesquels vous voulez remplacer la chaine:" &_

      vbCrLf&Saisie1, vbExclamation, "Modification par lot"


Const ForReading 1, ForWriting 2, ForAppending = 8

Dim fso, i, j, strtmp, Resultat

Set fso = CreateObject("Scripting.FileSystemObject")


'affiche une boite de dialogue à choix multiples

'*****valable uniquement sur XP*****

Dim objDialog, intResult, arrFiles, strPath, strFile

Set objDialog = CreateObject("UserAccounts.CommonDialog")

objDialog.Filter = "VBScript |*.vbs|Java Script| *.js|Batch| *.bat|" &_

                "Fichiers Texte| *.txt |Tous les fichiers|*.*"

objDialog.Flags = &H0200

objDialog.FilterIndex = 1

objDialog.InitialDir = "C:"

intResult = objDialog.ShowOpen


If intResult = 0 Then

    Wscript.Quit

Else

    arrFiles = Split(objDialog.FileName, " ")

    For i = 0 to Ubound(arrFiles)

        strFile = arrFiles(i)

           Dim objTextStream

           Set objTextStream = Fso.OpenTextFile(strFile, ForReading)

           Resultat = objTextStream.ReadAll

           strtmp = split(Resultat,"")

            For j = 0 to Ubound(strtmp)

                If instr(trim(strtmp(j)),Saisie1) Then

           
        strtmp(j) = Replace(strtmp(j),
Saisie1, Saisie2)

                End If

                objTextStream.Close

           
    Set objTextStream = Fso.OpenTextFile(strFile,
ForWriting, True)

                objTextStream.Write strtmp(j)

                objTextStream.Close

            Next

    Next

End If


Set objTextStream = Nothing

Set fso = Nothing

Set objDialog = Nothing

MsgBox "Modifications effectuées !!!", vbInformation, Now()
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Re,

Test sur un fichier .vbs contenant plusieurs le mot de saisie1 = > OK
Test sur un fichier dont le répertoire contient des spaces = OK

Test sur deux fichiers .vbs (touche CTRL) contenant plusieurs le mot de saisie1 = > KO

jean-marc....le testeur
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Bon alors, nouvel épisode.... <li>j'ai dit précédemment  En remplaçant "For i 1 to Ubound(arrFiles)" par "For i 0 to Ubound(arrFiles)" ça marche!!! 
euh... oui ça marche pour un seul fichier mais pas pour plusieurs......
donc il faut laisser  "For i = 1 to Ubound(arrFiles)", sachant que
le traitement ne fonctionnera pas si on ne sélectionne qu'un fichier....</li><li>Autre problème rencontré: le traitement ne s'effectue pas si on
sélectionne trop de fichier. Logique!! Une variable est limitée à 255
caractères et comme on stock les noms côte à côte, ça va vite. Donc si
on en voit pas la boîte de dialogue de fin c'est que rien n'a été
fait...</li>
Je ne sais pas trop comment résoudre le problème pour l'instant mais je vais y réfléchir, promis!!
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Re,

Résumé:
Pour le CommanDialog, j'ai été un très mauvais conseiller !!!
C'est joli, mais chiant à mettre en prod.
Avec le CommanDialog, il est possible d'afficher seulement les folders
(les fichiers ne sont pas affichés)...mais je ne retrouve pas cet exemple.

Bonne continuation.

jean-marc
Messages postés
78
Date d'inscription
vendredi 4 février 2005
Statut
Membre
Dernière intervention
6 octobre 2008

Nan nan JMO, merci à toi, ça m'a permis de me prendre le
choux dessus, d'apprendre à m'en servir et surtout de savoir que
c'était compatible VBScript !!!




http://www.microsoft.com/technet/scriptcenter/resources/qanda/mar05/hey0301.mspx




Par contre je n'ai pas encore tout compris à son utilisation mais je n'ai pas dit mon dernier mot !!!!....


En tous cas, heureusement que tu étais là pour me sortir de la panade, je trouve que le VBScript manque un peu sur ce forum...


@++
Messages postés
4
Date d'inscription
vendredi 29 septembre 2006
Statut
Membre
Dernière intervention
19 juillet 2010

Merci à vous deux :)
Hitch16 & JMO, vous m'avez fait progresser :)
Script intéressant, pas de solution trouvée pour les restrictions mentionnées