web-dev-qa-db-fra.com

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 ne pouvais rien trouver sur Google qui fasse ce dont j'avais besoin. Veuillez donc supporter 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 à naviguer de manière récursive dans le répertoire (get-ChildItem -recurse) et à trouver la chaîne que je cherchais avec get-content et select-string:

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 cherche?

270
Bluz

Cela devrait donner l’emplacement des fichiers contenant votre modèle:

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
418
jon Z

Il existe une variété de réponses précises ici, mais voici le code le plus concis pour plusieurs variantes. Pour chaque variante, la ligne supérieure indique la syntaxe complète et la dernière affiche une syntaxe abrégée.

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

  1. Liste FileInfo objets pour tous les fichiers contenant un motif:

    Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet }ls -rfilespec| ? { slspattern$_ -q }
  2. Liste noms de fichiers pour tous les fichiers contenant un motif:

    Get-ChildItem -Recursefilespec| Select-Stringpattern| Select-Object -Unique Pathls -rfilespec| slspattern| select -u Path
  3. Liste FileInfo objets pour tous les fichiers pas contenant le motif:

    Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }ls -rfilespec| ? { !(slspattern$_ -q) }
  4. Liste noms de fichiers pour tous les fichiers non contenant le motif:

    (Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }).FullName(ls -rfilespec| ? { !(slspattern$_ -q) }).FullName
68
Michael Sorens

Diffusez 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 ne voulez que 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
14
manojlds

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

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
13
user5000502
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

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

9
vikas368

Voici comment 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 ...

9
js2010

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 bien fonctionner 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
buygrush

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

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
5
Esperento57

Ceci affichera une liste du chemin complet de 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 ni les lignes de texte contenant la chaîne de recherche. Tout ce qu'il vous dit, c'est où vous pouvez trouver les fichiers contenant la chaîne.

3
Little Girl

J'ai modifié l'une des réponses ci-dessus pour me donner un peu plus d'informations. Cela m'a épargné une deuxième requête plus tard. C'était quelque chose comme ça:

Get-ChildItem `
        -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
    Select-String -pattern "dummy" | `
    Select-Object -Property Path,LineNumber,Line | `
    Export-CSV "C:\ResultFile.csv"

Je peux spécifier les jokers de chemin et de fichier avec cette structure, et cela enregistre le nom du fichier, le numéro de la ligne et la ligne correspondante dans un fichier de sortie.

2
RenoGreg