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

J’ai commencé à apprendre à utiliser Powershell il y a quelques jours et je n’ai rien trouvé sur Google qui fasse ce dont j’ai besoin.

On m’a demandé de remplacer certaines chaînes de texte dans une application Jboss exécutée sur Windows. 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 le répertoire ( get-ChildItem -recurse ) et à trouver la chaîne que je cherchais avec get-content et select-ssortingng:

 Get-ChildItem -recurse | Get-Content | Select-Ssortingng -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 également 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?

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

 Get-ChildItem -recurse | Select-Ssortingng -pattern "dummy" | group path | select name 

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 affiche la syntaxe complète et le bas affiche une syntaxe concise.

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

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

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

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

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

     (Get-ChildItem -Recurse filespec | Where-Object { !(Select-Ssortingng pattern $_ -Quiet) }).FullName (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName 

Pipe le contenu de ton

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

à fl *

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

Si vous ne voulez que le chemin, utilisez select path ou select -unique path pour supprimer les doublons:

 Get-ChildItem -recurse | Get-Content | Select-Ssortingng -pattern "dummy" | select -unique path 
 Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-ssortingng -pattern "dummy"} 

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

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

 Get-ChildItem -Path d:\applications\*config -recurse | Select-Ssortingng -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 envoyée par vikas368 (qui ne semble pas fonctionner correctement avec la saisie semi-automatique ISE):

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

ou en bref:

 ls -r | ?{ $_ | Select-Ssortingng -Pattern "dummy" } 

Voici comment je le ferais, vous n’avez pas besoin de get-content:

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

ou

 ls -r | Select-Ssortingng dummy | fl 

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

Cela affichera une liste du chemin d’access complet à chaque fichier contenant la chaîne de recherche:

 foreach ($file in Get-ChildItem | Select-Ssortingng -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 effectuez une recherche dans un répertoire, vous pouvez le faire:

 select-ssortingng -Path "c:\temp\*.*" -Pattern "result" -List | select Path