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?
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
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.
-
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 }
-
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
-
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) }
-
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
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
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}
Cela vous donnera tous les détails de tous les fichiers
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"
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" }
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...
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.
Si vous recherchez dans un répertoire, vous pouvez le faire:
select-string -Path "c:\temp\*.*" -Pattern "result" -List | select Path