Powershell – Rechercher et remplacer un motif dans un fichier qui est présent dans plusieurs dossiers.

Par défaut

Problématique

J’ai un fichier « Preferences.strings » qui est présent dans plusieurs dossiers.

Powershell_recherche_remplace_motif_fichier

Ce fichier contient un texte « Color Theme » que je souhaiterais remplacer par un autre texte, « UX Theme »

Powershell_recherche_remplace_motif_fichier2

Comment faire ?

Avec Powershell, comme toujours.

Tout d’abord, j’utilise Get-ChildItem, pour d’abord filter sur les fichiers qui ont l’extension .strings .
Ensuite,  à partir de ce premier groupe de résultats, je procède par appliquer un autre filtre, en fonction du nom du fichier, qui est  « Preferences »


$filenames = Get-ChildItem "C:\Users\adookhan\Desktop\Powershell\2464\test\Sites\Sites\*.strings" -Recurse | Where-Object { $_.Name -match 'Preferences' }
select -expand fullname

Ensuite, je parcours ces fichiers et je lis les contenus avec Get-Content.
Je remplace ensuite le motif recherché « Color Theme » par « UX Theme », et je termine
avec Set-Content


(Get-Content $filename) -replace 'Color Theme', 'UX Theme' | Set-Content $fileName

Voici le code complet


$filenames = Get-ChildItem "C:\Users\adookhan\Desktop\Powershell\2464\test\Sites\Sites\*.strings" -Recurse | Where-Object { $_.Name -match 'Preferences' }
select -expand fullname
foreach ($filename in $filenames)
{
#Write-Host ($filenames| Format-Table | Out-String)

(Get-Content $filename) -replace 'Color Theme', 'UX Theme' | Set-Content $fileName
}

Le resultat
Powershell_recherche_remplace_motif_fichier3

Powershell – Rechercher un motif spécifique contenu(s) dans un ou plusieurs fichiers, en filtant sur le type de fichiers que l’on veut rechercher.

Par défaut

Par example, on a des fichiers textes dans lesquelles on recherche la presence du mot « pomme ».

Une connaissance basique des variables Powershell et ( quelques cmdlets) est certainement un allié de poids. En effet, plutôt que d’écrire une commande complexe et vous arracher les cheveux pour des histoires syntaxiques, les variables vous permettent de décomposer chaque bloc ou élément de code, afin d’avancer à votre rythme.
Les variables sont généralement nommées, et leurs noms sont toujours précédés d’un symbole “$“

Ici, je declare 4 variables, à savoir,

SChemin -> le chemin contenant le nom du repertoire dans lequel je veux rechercher.

$Motif -> Le motif que je veux rechercher.

STypesFichiers -> Les extensions de fichiers dans lequel effectuer la recherche, je veux par example lire qu’à l’interieur des fichiers html ou textes.

$Resultats -> Un fichier qui contient les résultats de la recherche, normalement un fichier texte.

Le code :


$Chemin = "C:\Users\adookhan\Desktop\text\"
$Motif = "pomme"
$TypesFichiers ="*.txt"
$PathArray = @()
$Resultats = "C:\Users\adookhan\Desktop\resultats.txt"

Get-ChildItem $Chemin -Filter $TypesFichiers -recurse | Select-String -pattern $Motif | group path | select name > $Resultats
1.PNG

Resultats.txt
Name
—-
C:\Users\adookhan\Desktop\text\a.txt

Le test a aussi été effectué sur un repertoire contenant plusieurs centaines de dossiers et de fichiers ( taille moyenne des fichiers ~ 20 kb )  avec des motifs complexes. Sur un Serveur 2.8 GHZ, quadcore, le résultat est très satisfaisant, ..1 seconde.

Voila !