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?
Cela devrait donner l’emplacement des fichiers contenant votre modèle:
Get-ChildItem -recurse | Select-String -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 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.
Liste FileInfo objets pour tous les fichiers contenant un motif:
Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet }ls -rfilespec| ? { slspattern$_ -q }
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
Liste FileInfo objets pour tous les fichiers pas contenant le motif:
Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }ls -rfilespec| ? { !(slspattern$_ -q) }
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
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
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"
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}
Cela vous donnera les détails complets de tous les fichiers
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 ...
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" }
Si vous recherchez dans un répertoire, vous pouvez le faire:
select-string -Path "c:\temp\*.*" -Pattern "result" -List | select Path
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.
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.