Comment rechercher une chaîne dans plusieurs fichiers et renvoyer les noms des fichiers dans Powershell?

J'ai commencé à apprendre powershell il y a quelques jours, et je n'ai rien trouvé sur google qui fasse ce dont j'ai besoin, alors veuillez répondre à ma question.

On m'a demandé de remplacer certaines chaînes de texte dans plusieurs fichiers. Je ne connais pas nécessairement l'extension des fichiers cibles possibles et je ne connais pas non plus leur emplacement. Jusqu'à présent, j'ai réussi à parcourir récursivement dans le répertoire (get-ChildItem -recurse) et à trouver la chaîne que je cherchais avec get-content et sélectionnez-Chaîne:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

Le problème est que je peux voir les occurrences du texte que je cherche, mais je ne sais pas comment dire à PS de renvoyer le chemin et le nom de tous les fichiers correspondants.

Comment puis-je obtenir le nom et l'emplacement des fichiers contenant l'expression que je recherche?

215
demandé sur Bluz 2011-11-16 19:00:29

9 réponses

Cela doit donner l'emplacement des fichiers qui contiennent votre modèle:

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
339
répondu jon Z 2011-11-16 15:08:33

Il y a une variété de réponses précises ici, Mais voici le code le plus concis pour plusieurs variantes différentes. Pour chaque variation, la ligne du haut montre la syntaxe complète et la syntaxe du bas montre laconique.

Item (2) est une forme plus concise des réponses de Jon Z et manojlds, tandis que item (1) est équivalent aux réponses de vikas368 et buygrush.

  1. ListeFileInfo objets pour tous les fichiers contenant un motif:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
  2. Liste noms de fichiers pour tous les fichiers contenant un motif:

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
  3. Liste FileInfo objets pour tous les fichiers ne contenant pas motif:

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
  4. Liste noms de fichiers pour tous les fichiers ne contenant pas motif:

    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    
52
répondu Michael Sorens 2015-04-17 12:38:40

Canaliser le contenu de votre

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

À fl *

Vous verrez que le chemin est déjà renvoyé en tant que propriété des objets.

SI vous voulez juste le chemin, utilisez select path ou select -unique path pour supprimer les doublons:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
15
répondu manojlds 2011-11-16 16:20:51
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

Cela vous donnera tous les détails de tous les fichiers

9
répondu vikas368 2011-11-22 13:13:38

Cela affichera le chemin, le nom de fichier et la ligne de contenu trouvée qui correspond au motif.

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
7
répondu user5000502 2015-06-11 18:41:09

Pour conserver les détails complets du fichier dans le tableau résultant, vous pouvez utiliser une légère modification de la réponse publiée par vikas368 (qui ne semblait pas fonctionner correctement avec la saisie semi-automatique ISE):

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

Ou, en bref:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }
5
répondu buygrush 2014-02-21 10:12:12

C'est comme ça que je le ferais, vous n'avez pas besoin de get-content:

ls -r | Select-String dummy | select line,path

Ou

ls -r | Select-String dummy | fl

Pour voir quelles sont les différentes propriétés...

5
répondu js2010 2017-06-05 17:34:36

Cela affichera une liste du chemin d'accès complet à chaque fichier contenant la chaîne de recherche:

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

Notez qu'il n'affiche pas d'en-tête au-dessus des résultats et n'affiche pas les lignes de texte contenant la chaîne de recherche. Tout ce qu'il vous dit est où vous pouvez trouver les fichiers qui contiennent la chaîne.

3
répondu Little Girl 2014-12-07 18:48:17

Si vous recherchez dans un répertoire, vous pouvez le faire:

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
3
répondu Esperento57 2017-02-05 11:00:13