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 :

Parcourir des dossiers et fichiers et extraire les données


Sujet :

Scripts/Batch

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut Parcourir des dossiers et fichiers et extraire les données
    Bonjour,

    Je me présente, je suis WarriorExtreme et j'ai un petit souci au niveau de l'algo.

    Mon problème :
    Parcourir des dossiers récursivement ==> Pas de soucis
    Lister les fichiers existants avec une certaine extension ==> Pas de soucis
    Ouvrir les fichiers un par un et extraire des mot-clefs ==> Souci
    Pour ensuite les écrire dans un fichier txt dans l'ordre alphabétique ==> Souci
    Tous ces fichiers seront copiés dans le Desktop utilisateur avec un répertoire nommé par exemple resultatRequest dans lequel on aura tous les fichiers. ==> Problème

    Pourquoi le problème ?
    Et bien tout simplement parce que l'ordre des requêtes récursivement me perturbe.

    Exemple dans un fichier cpp, je dois récupérer tous les mot-clefs GetMsg() et
    extraire le premier paramètre entre guillemets "" car il y a deux paramètres puis les écrire dans un fichier txt dans l'ordre alphabétique. Et tout ça pour tous les fichiers récursivement.
    Algo constaté :
    Tant qu'il y a des répertoires ==> première boucle
    Tant qu'il y a des fichiers cpp ==> deuxième boucle
    Dans la deuxième boucle, ouvrir les fichiers un par un et faire un getline+ jusqu'à la fin de fichier et les écrire dans un fichier qu'on aura crée dans l'ordre alphabétique.
    ex : GetMsg("error.tool.nocreationallowedandclose", msg);

    Tout ça avec une petite interface graphique en WPF.
    Ceci a été déjà crée, je vous joint le fichier.
    Pour l’exécuter, set-executionpolicy remotesigned dans powershell
    ensuite powershell.exe -sta ./le-fichier-joint.ps1

    Voilà, si vous avez des solutions plus simple, je suis preneur car je suis un petit peu débutant en powershell et il n'y a pas beaucoup de tuto sur la gestion de fichier Windows.

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    
    #################################################################
    #                   Chargement des Librairies                   #
    #################################################################
    
    [Reflection.Assembly]::LoadWithPartialName("PresentationFramework")
    [Reflection.Assembly]::LoadWithPartialName("PresentationCore")
    [Reflection.Assembly]::LoadWithPartialName("WindowsBase")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    
    #################################################################
    
    
    #----------------------------------------------------------------
    #               Déclaration des variables                       #
    #----------------------------------------------------------------
    
    $ofs = "`r`n"
    $tab = @()
    $tab += "First.tdb"
    $tab += "Second.tdb"
    $memo = "Champ vide. Selectionner un repertoire"
    
    #----------------------------------------------------------------
    
    
    #-----------------------------------------------------------------------------------------
    # Affectation du couple tableau + Combobox utilisé pour peupler la DropDownBox dans WPF  #
    #-----------------------------------------------------------------------------------------
    
    $Dropper=$tab
    
    #-----------------------------------------------------------------------------------------
    
    
    #----------------------------------------------------------------
    #Le code XAML envoyé dans une variable Powershell               #
    #----------------------------------------------------------------
    
    [xml]$xaml = '
    <Window
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="WPF Powershell LangChecker" Height="300" Width="560" ResizeMode="NoResize">
    <Canvas>
    <ComboBox Name="MyDrop" Height="25" Width="200" Canvas.Top="10" Canvas.Left="10" >
    </ComboBox>
     <TextBox Height="23" HorizontalAlignment="Left" Margin="238,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="213" />
    <Button Content="Parcourir" Height="23" HorizontalAlignment="Left" Margin="460,12,0,0" Name="button1" VerticalAlignment="Top" Width="65" />
    <TextBox Name="Mytexte" Height="100" Width="520" Canvas.Top="40" Canvas.Left="10" 
    IsReadOnly="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Foreground="Blue">
     Test
    </TextBox>
    <Button Content="Quitter" Height="23" HorizontalAlignment="Left" Margin="460,230,0,0" Name="buttonQuitter" VerticalAlignment="Top" Width="75" />
    
    </Canvas>
    </Window>
    '
    
    #--------------------------------------------------------------
    
    
    #--------------------------------------------------------------
    #Déclaration du code XML et de la Forms puis des systems      #
    #--------------------------------------------------------------
    
    $wpf=(New-Object System.Xml.XmlNodeReader $xaml)
    $Form=[Windows.Markup.XamlReader]::Load( $wpf )
    $object = New-Object -comObject Shell.Application 
    $System = New-Object System.Windows.Forms.Form
    
    #--------------------------------------------------------------
    
    
    #--------------------------------------------------------------
    # Les Fonctions						       
    #--------------------------------------------------------------
    
    function Select-Folder($message='Select a folder', $path = 0) {
    	$folder = $object.BrowseForFolder(0, $message, 0, $path) 
    	if ($folder -ne $null) { 
    		$LabelTextBox1.clear()
    		$LabelTextBox1.AppendText($folder.self.Path)
    		executor($folder.self.Path)
    	}
    }
    
    function	executeProg()
    {
    	$Output.AppendText($ofs + "Executing Threads !!!")
    	getSelectedItem
    }
    
    function	executor($this)
    {
    	$maVar = $this
    	$Output.AppendText($ofs + (get-ChildItem -recurse $maVar -include *.cpp))
    	$Output.AppendText($ofs + "Script finished ...")
    }
    
    function	getSelectedItem()
    {
    	$Output.AppendText($ofs + "Execution success !!!")
    	Select-Folder
    }
    
    #--------------------------------------------------------------
    
      
    #-------------------------------------------------------------
    #      Récupération des contrôles WPF dans PowerShell        #
    #-------------------------------------------------------------
    
    $btndrop = $Form.FindName('MyDrop')
    $Output = $Form.FindName('Mytexte')
    $GetFolderExist = $Form.FindName('button1')
    $LabelTextBox1 = $Form.FindName('textBox1')
    $boutonQuitter = $Form.FindName('buttonQuitter')
    
    #-------------------------------------------------------------
    
    
    #-------------------------------------------------------------
    #           Boucle sur les fichiers tdb existants            #
    #-------------------------------------------------------------
    
    foreach ($i in $Dropper)
    {
    	$btnDrop.Items.Add($i)| out-null
    }
    
    #-------------------------------------------------------------
    
    
    #---------------------------------------------------------------
    #Ajustons une propriété du contrôle TextBox et GetFolderExist  #
    #---------------------------------------------------------------
    
    $btnDrop.ToolTip = "Sélectionnez le DropDownBox"
    $GetFolderExist.ToolTip = "Select a Folder"
    $LabelTextBox1.ToolTip = "Path of folder selected"
    $boutonQuitter.ToolTip = "Close the window"
    
    #---------------------------------------------------------------
    
    
    #---------------------------------------------------------------
    # Recupération de l'événement SelectionChanged du contrôle     #
    #---------------------------------------------------------------
    
    $btnDrop.Add_SelectionChanged({$Output.AppendText($ofs + "Mes interfaces PowerShell !!!")})
    $GetFolderExist.Add_Click({executeProg})
    $boutonQuitter.Add_Click({$Form.Close()})
    
    #---------------------------------------------------------------
    
    
    #-------------------------------------------
    #  The application is starting ...           
    #-------------------------------------------
    
    $Form.ShowDialog() | out-null
    
    #-------------------------------------------
    Merci @++

    WarriorExtreme

  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
    Billets dans le blog
    1
    Par défaut
    Salut,
    pour ceci
    Citation Envoyé par WarriorExtreme Voir le message
    Algo constaté :
    Tant qu'il y a des répertoires ==> première boucle
    Tant qu'il y a des fichiers cpp ==> deuxième boucle
    tu peux fusionner les deux instructions, un exemple :
    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
    # Recherche tous les fichiers Winform d'une arborescence
    # le nom fini uniquement par ".Designer.cs"
    # Le début peut être quelconque  = *
    # sauf = *.ascx.designer.cs
    # sauf = *.aspx.designer.cs
    # sauf les fichiers des répertoires dont le nom finit par "Properties", donc :
    #        sauf = Ressources.designer.cs
    #        sauf = Settings.designer.cs
    #
     #Défini le répertoire de projet,
    $global:PathProjets="xxx"
     # Défini le répertoire contenant les projets Winform de test
    $global:PathWinForm="$PathProjets\TestsWinform"
     #Mémorise le répertoire courant,
    $local:Push=Get-Location
    [void](cd $PathWinform)
       #Segment 1 : Recherche tous les fichiers Winform d'une arborescence, on exclut ceux des projets WEB
    Get-ChildItem -recurse -include *.Designer.cs -exclude *.as[cp]x.designer.cs|`
       #Segment 2 : On exclut les fichiers contenus dans les répertoires dont le nom se termine par Properties
     where {(Split-Path ($_).Fullname) -notmatch 'Properties$'}|`
       #Segment 3 : On enregistre le nom complet des fichiers trouvés
     ForEach {($_).Fullname}
     
     #Restaure le path
    [void](cd $local:Push)
    Pour :
    Citation Envoyé par WarriorExtreme Voir le message
    Dans la deuxième boucle, ouvrir les fichiers un par un et
    faire un getline+ jusqu'à la fin de fichier et
    Consulte la doc du cmdlet Select-String basé sur une regex. Ici la difficulté peut être sur des déclarations de ton pattern 'étalé' sur + lignes.
    Et pour
    Citation Envoyé par WarriorExtreme Voir le message
    les écrire dans un fichier qu'on aura crée dans l'ordre alphabétique.
    Utilise le cmdlet Sort-Object, puis le cmdlet Set-Content.
    Il est fort probable que ton traitement puisse se faire avec un seul pipeline.
    En construisant une arborescence de test, tu pourras valider ton traitement, mais hors du GUI.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Merci, je vais testé et je te fais part du résultat.

    A++

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Salut,

    J'aurai une petite question ?
    Je parse un fichier CPP et je cherche le premier paramètre d'une fonction qui
    s'appelle GetMsg("String", msg); Donc, j'ai besoin d'extraire la chaine de caractères qui est entre les guillemets dans chaque ligne contenant GetMsg.
    Comment pourrai-je procéder en Powershell. J'ai vu qu'il y avait Select-String mais il me retourne la ligne entière.
    Ma ligne qui parse le fichier + ligne par ligne + écrit dans un autre fichier tout ce qu'il a trouvé.
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function	parseFile($FileDestination)
    {
    	Get-Content $MonFichierCPP |  Select-String "GetMsg" | Set-Content $FileDestination
    }
    Merci d'avance !!!

  5. #5
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Citation Envoyé par WarriorExtreme Voir le message
    Salut,

    J'aurai une petite question ?
    Je parse un fichier CPP et je cherche le premier paramètre d'une fonction qui
    s'appelle GetMsg("String", msg); Donc, j'ai besoin d'extraire la chaine de caractères qui est entre les guillemets dans chaque ligne contenant GetMsg.
    Comment pourrai-je procéder en Powershell. J'ai vu qu'il y avait Select-String mais il me retourne la ligne entière.
    salut,

    l'une des solutions possibles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $file=content cppfile
    filter ssm { $_.Matches | % { $($_.groups[1]).value } }
    $file | select-string 'GetMsg\s*\("(.*?)"'| ssm

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Bonjour,

    ça ne marche pas mon ami. Ça devrai fonctionner avec des .Substring() ou des fonctions du genre mais ça ne marche plus c'est chaud.

    Quelqu'un aurai une autre idée ???

    Merci,

    Warrior de l'extrême

Discussions similaires

  1. Parcourir des dossiers et lire dans des fichiers
    Par Mut dans le forum Windows
    Réponses: 2
    Dernier message: 13/09/2013, 11h33
  2. parcourir des dossiers et choisir un fichier
    Par juju44 dans le forum Macro
    Réponses: 3
    Dernier message: 11/04/2009, 18h33
  3. [Données] Extraire les données des dossiers publics (SQL ?)
    Par Commodore dans le forum VBA Outlook
    Réponses: 3
    Dernier message: 26/02/2008, 16h22
  4. Réponses: 1
    Dernier message: 26/01/2007, 08h15
  5. Pour extraire les données d'un fichier texte
    Par Floch dans le forum Access
    Réponses: 2
    Dernier message: 02/05/2006, 15h01

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