J'ai commencé à apprendre le powershell il y a quelques jours, et je n'ai rien trouvé sur google qui fasse ce dont j'ai besoin, veuillez donc répondre à ma question.
On m'a demandé de remplacer certaines chaînes de texte dans plusieurs fichiers. Je ne connais pas forcément 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-string:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
Le problème est que je peux voir les occurrences du texte que je recherche, mais je ne sais pas comment dire à PS de renvoyer le chemin et le nom de tous les fichiers correspondants.
Comment obtenir le nom et l'emplacement des fichiers contenant l'expression que je recherche?
Réponses:
Cela devrait donner l'emplacement des fichiers qui contiennent votre modèle:
la source
name
paramètre. Essayez d'ajouter| %{Move-Item $_.name <destination>}
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path
renvoie uniquement la première correspondance pour chaque fichier, ce qui peut être un peu plus efficace et éviter d'avoir à les regroupertxt
fichiers, si vous utilisez à laGet-ChildItem -Recurse -Filter *.txt
placeforeach
boucle si vous effectuez de grandes opérations comme ça. Cela devient très compliqué lorsque vous essayez de faire tout cela sur une seule ligne et il est très facile de faire une grosse erreur. Je parle d'expérienceIl existe 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 le bas montre la syntaxe laconique.
Le point (2) est une forme plus concise des réponses de Jon Z et manojlds, tandis que le point (1) est équivalent aux réponses de vikas368 et buygrush.
Liste les objets FileInfo pour tous les fichiers contenant un modèle:
Liste des noms de fichiers pour tous les fichiers contenant un modèle:
Liste les objets FileInfo pour tous les fichiers ne contenant pas de modèle:
Liste les noms de fichiers pour tous les fichiers ne contenant pas de modèle:
la source
-List
paramètre deSelect-String
Cela affichera le chemin, le nom de fichier et la ligne de contenu trouvée correspondant au modèle.
la source
Canalisez le contenu de votre
à
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
ouselect -unique path
pour supprimer les doublons:la source
-File
commutateur àGet-ChildItem
ou vous vous retrouvez avec une cascade sans fin d'erreurs d'essayer d'appeler desGet-Content
répertoires.(Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName
gens semblent oublier que PowerShell est orienté objet; en cas de doute, recherchez une propriétéVoici comment je le ferais, vous n'avez pas besoin de get-content:
ou
Pour voir quelles sont les différentes propriétés ...
C'est plus rapide. Le deuxième argument est -filter:
la source
select Pattern, LineNumber, Filename
pour une sortie plus concise. La ligne renvoie TOUT sur la ligne contenant votre chaîne de modèle. Vous pouvez également facilement le transmettre à un fichier csv si vous le souhaitez.Cela vous donnera tous les détails de tous les fichiers
la source
-r
fonctionnait. Je pensais que vous deviez toujours le faire-Recurse
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 semble pas bien fonctionner avec la saisie semi-automatique ISE):
ou en bref:
la source
Si vous recherchez dans un répertoire, vous pouvez le faire:
la source
Cela affichera une liste du chemin d'accès complet à chaque fichier qui contient la chaîne de recherche:
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 indique, c'est où vous pouvez trouver les fichiers qui contiennent la chaîne.
la source
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:
Je peux spécifier le chemin et les caractères génériques de fichier avec ces structures, et il enregistre le nom de fichier, le numéro de ligne et la ligne pertinente dans un fichier de sortie.
la source