IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Faire un Scan/Replace de fichiers MS Office de façon réccursive


Sujet :

Scripts/Batch

  1. #1
    Membre régulier Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Points : 117
    Points
    117
    Par défaut Faire un Scan/Replace de fichiers MS Office de façon réccursive
    Bonjour, le tire est assez clair.

    en recherchant j'ai pu trouver ceci : (get-content monFichier) | foreach-object {$_ -replace "OLD", "NEW"} | set-content monFichier
    La modification est bien effectuée, mais le fichier s'est retrouvé corrompu .....


    Voici mon besoin final plus en détail :

    Réaliser 2 scripts pour scanner puis remplacer une chaine de caractère dans des fichiers .doc

    Script de scan :
    1) Scanner une arborescence à la recherche d'une chaine de caractère (avec des fois des espaces) à l'intérieur des fichiers (sans tenir compte des méta données du fichier).
    2) Inscrire dans un fichier le résultat du scan avec :
    ° le Sous-dossier traité,
    ° le nombre de fichiers parcourus,
    ° le nombre de modifications à faire,
    ° La liste des fichiers à modifier.
    3) Pouvoir réutiliser ce fichier résultat en tant que fichier de paramètre pour effectuer dans un second script les modifs.

    Script de remplacement :
    4) Aller lire le fichier résultat du scan
    5) copier dans un dossier de travail l'arborescence qui sera touchée
    6) faire le remplacement dans les fichiers.

    Chose qui serait pratique, serait d'avoir dans un fichier externe (type .ini) le paramétrage (l'emplacement du dossier parent, l'emplacement du dossier de travail et la chaine recherchée).

    Une fois les 2 script passés, il n'y a plus qu'à recopier l'arborescence de l'emplacement de travail vers l'emplacement réell.

    Petit dessin :

    Emplacement réell :
    Sous-dossier_1
    Fichier_1.doc
    Fichier_2 avec des espaces.doc
    Fichier_3.doc
    Sous-dossier_2
    Fichier_4.doc
    Fichier_5.doc
    Fichier_6.doc
    Fichier_7.doc
    Sous-dossier_3
    Sous-dossier_4
    Fichier_8.doc
    Fichier_9.doc
    Fichier_10.doc
    Fichier_11.doc
    Fichier_12.doc
    Fichier_13.doc


    Emplacement de travail :
    Sous-dossier_1
    Fichier_1.doc
    Fichier_2 avec des espaces.doc
    Sous-dossier_2
    Fichier_4.doc
    Fichier_8.doc
    Sous-dossier_3
    Sous-dossier_4
    Fichier_11.doc


    Je me tourne vers powershell car la commande find ou findstr me ramène également des informations dans les tag des fichiers, ce que je souhaite éviter.

    Actuellement, je bloque au premier point, et j'aimerai bien un petit coup de pousse .....

    J'espère être clair.


    A+

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par Bragu Demon Voir le message
    Réaliser 2 scripts pour scanner puis remplacer une chaine de caractère dans des fichiers .doc
    Si tu parles de documents Word, il te faut utiliser Ole Automation.
    Set-Content travaille au niveau Byte ou ASCII, pas étonnant que tu corromps un fichier Word avec.

  3. #3
    Membre régulier Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    Merci Laurent, je vais regarder ça :-)

  4. #4
    Membre régulier Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    Bonjour,

    Je reviens aujourd'hui après quelques tests infructueux.
    J'ai donc lu et testé le script cité en lien et voici le résultat :
    Nom : ps.jpg
Affichages : 249
Taille : 143,7 Ko

    C'est assez peut probant.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    # Création de l'instance Word.application
    $objWord = New-Object -ComObject word.application
    $objWord.Visible = $True
    $objDoc = $objWord.Documents.Open("D:\test.doc")
    $objSelection = $objWord.Selection
    
    # Texte recherché et de remplacement
    $FindText = "searched for"
    $ReplaceText = "recherché"
    
    # Paramétrage des options pour le remplacement
    $ReplaceAll = 2
    $FindContinue = 1
    $MatchCase = $False
    $MatchWholeWord = $True
    $MatchWildcards = $False
    $MatchSoundsLike = $False
    $MatchAllWordForms = $False
    $Forward = $True
    $Wrap = $FindContinue
    $Format = $False
    
    
    # Exécution de la recherche et du remplacement
    objSelection.Find.Execute(
    	$FindText,
    	$MatchCase,
    	$MatchWholeWord,
    	$MatchWildcards,
    	$MatchSoundsLike,
    	$MatchAllWordForms,
    	$Forward,
    	$Wrap,
    	$Format,
    	$ReplaceText,
    	$ReplaceAll
    	)

    Le fichier test.doc contient :

    The text to be searched for. Use an empty string ("") to search for formatting only. You can search for special characters by specifying appropriate character codes. For example, "^p" corresponds to a paragraph mark and "^t" corresponds to a tab character.
    J'aimerai bien un petit coup de main là

  5. #5
    Membre régulier Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    A titre indicatif, voici ma version de powershell :

    PS C:\Windows\System32\WindowsPowerShell\v1.0> $PSVersionTable

    Name Value
    ---- -----
    CLRVersion 2.0.50727.5466
    BuildVersion 6.1.7601.17514
    PSVersion 2.0
    WSManStackVersion 2.0
    PSCompatibleVersions {1.0, 2.0}
    SerializationVersion 1.1.0.1
    PSRemotingProtocolVersion 2.1

    (Windows 7 Entreprise 64 bits)

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bragu Demon Voir le message
    J'aimerai bien un petit coup de main là
    Il faut comprendre le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objSelection.Find.Execute(...
    Ici le parseur PS ne sait quoi faire de ta déclaration, car il manque le dollar ($).
    Dans les sources de ce tutoriel, tu as un script nommé Test-PSScript.ps1 qui te permet de valider la syntaxe d'un script.

  7. #7
    Membre régulier Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    Merci pour cette info, je part de très très loin et je fais en plus des erreur de débutant ...
    Je ne peux malheureusement pas aller sur le site depuis ici pour récupérer le Test-PSScript.ps1, le proxy ne m'y autorise pas.

    J'ai maintenant un problème de parenthèse :

    Jeton «*(*» inattendu dans une expression ou une instruction.
    Au niveau de P:\Documents\PERSONNEL\SCRIPTS\PowerShell\ReplaceWordinWord.ps1*: 26 Caractère*: 29
    + $objSelection.Find.Execute ( <<<< $FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike,
    $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)
    + CategoryInfo : ParserError: ((:String) [], ParseException
    + FullyQualifiedErrorId : UnexpectedToken

    Je vais creuser histoire de m'en sortir un peu

  8. #8
    Membre régulier Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    Bon,

    J'ai résolu mon problème de jeton, c'était une parenthèse qui n'était pas à la bonne place.

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bragu Demon Voir le message
    Merci pour cette info, je part de très très loin et je fais en plus des erreur de débutant ...
    Nous sommes tous passé par là
    Citation Envoyé par Bragu Demon Voir le message
    Je ne peux malheureusement pas aller sur le site depuis ici pour récupérer le Test-PSScript.ps1, le proxy ne m'y autorise pas.
    Le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    function Test-PSScript 
    {  #Valide la syntaxe d'un fichier powershell (ps1,psm1,psd1)
     #From http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2009/09/07/parsing-powershell-scripts.aspx 
    
       param( 
          [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]  
          [ValidateNotNullOrEmpty()]  
          [Alias('PSPath','FullName')]  
          [System.String[]] $FilePath, 
    
          [Switch]$IncludeSummaryReport 
       ) 
    
       begin 
       { $total=$fails=$FileUnknown=0 }   
    
       process 
       { 
           $FilePath | 
            Foreach-Object { 
               if(Test-Path -Path $_ -PathType Leaf) 
               { 
                  $Path = Convert-Path -Path $_  
      
                  $Errors = $null 
                  $Content = Get-Content -Path $path  
                  $Tokens = [System.Management.Automation.PsParser]::Tokenize($Content,[ref]$Errors) 
                  if($Errors -ne $null) 
                  { 
                     $fails++ 
                     $Errors | 
                      Foreach-Object {  
                        $CurrentError=$_
                        $CurrentError.Token | 
                         Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru | 
                         Add-Member -MemberType NoteProperty -Name ErrorMessage -Value $CurrentError.Message -PassThru 
                     } 
                  } 
                 $total++
               }#if 
               else 
               { Write-Warning  "File unknown :'$_'";$FileUnknown++ } 
           }#for 
       }#process  
    
       end  
       { 
          if($IncludeSummaryReport)  
          { 
             Write-Host "`n$total script(s) processed, $fails script(s) contain syntax errors,  $FileUnknown file(s) unknown." 
          } 
       } 
    } #Test-PSScript
    Attention, ce code ne valide que la syntaxe. Il évite de livrer un script/module contenant des erreurs de syntaxe.

  10. #10
    Membre régulier Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    Merci :-)


    C'est normal d'avoir mal à la tête quand on fait du powershell ?

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bragu Demon Voir le message
    C'est normal d'avoir mal à la tête quand on fait du powershell ?
    Mal à la tête je ne sais pas, mais je me souviens que mes débuts ont été laborieux.
    Il y a beaucoup d'informations et de comportements à mémoriser, il faut donc, à mon avis, être patient

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/01/2006, 16h31
  2. Faire une recherche dans un fichier XML
    Par Devilish_Seraph dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 21/01/2006, 13h41
  3. [DBF] Comment faire une insertion dans le fichier ?
    Par dor_boucle dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 14/12/2005, 07h46
  4. Comment faire une insertion dans un fichier texte ?
    Par Isa31 dans le forum Langage
    Réponses: 10
    Dernier message: 28/12/2004, 09h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo