J'ai plusieurs fichiers de configuration sur Windows Server 2008 imbriqués comme tels:
C:\Projects\Project_1\project1.config
C:\Projects\Project_2\project2.config
Dans ma configuration, je dois faire un remplacement de chaîne comme tel:
<add key="Environment" value="Dev"/>
va devenir:
<add key="Environment" value="Demo"/>
J'ai pensé à utiliser le script par lots, mais il n'y avait pas de bon moyen de le faire, et j'ai entendu dire qu'avec le script PowerShell, vous pouvez facilement le faire. J'ai trouvé des exemples de recherche / remplacement, mais j'espérais un moyen qui traverserait tous les dossiers de mon répertoire C: \ Projects et trouverait tous les fichiers qui se terminent par l'extension '.config'. Quand il en trouve un, je veux qu'il remplace mes valeurs de chaîne.
Avez-vous de bonnes ressources pour savoir comment faire cela ou des gourous de PowerShell qui peuvent offrir un aperçu?
la source
Réponses:
Voici une première tentative au sommet de ma tête.
la source
ls *.config -rec | %{ $f=$_; (gc $f.PSPath) | %{ $_ -replace "Dev", "Demo" } | sc $f.PSPath }
.
aprèsls
. J'ai été piqué par ça moi-même.PowerShell est un bon choix;) Il est très facile d'énumérer les fichiers dans un répertoire donné, de les lire et de les traiter.
Le script pourrait ressembler à ceci:
J'ai divisé le code en plusieurs lignes pour qu'il soit lisible pour vous. Notez que vous pouvez utiliser Set-Content à la place de
[IO.File]::WriteAllText
, mais cela ajoute une nouvelle ligne à la fin. AvecWriteAllText
vous pouvez l'éviter.Sinon , le code pourrait ressembler à ceci:
$c | Set-Content $_.FullName
.la source
Cette approche fonctionne bien:
la source
Get-Content $_
parGet-Content $_.FullName
, et l'équivalentSet-Content
pour qu'il gère les fichiers qui n'étaient pas à la racine.J'irais avec xml et xpath:
la source
Cet exemple PowerShell recherche toutes les instances de la chaîne "\ foo \" dans un dossier et ses sous-dossiers, remplace "\ foo \" par "\ bar \" ET NE RÉÉCRIVE PAS les fichiers qui ne contiennent pas la chaîne "\ foo \ "De cette façon, vous ne détruisez pas les horodatages de la dernière mise à jour du fichier où la chaîne n'a pas été trouvée:
la source
J'ai trouvé le commentaire de @Artyom utile mais malheureusement il n'a pas posté de réponse.
C'est la version courte, à mon avis la meilleure version, de la réponse acceptée;
la source
foreach-object
place de l'%
alias lors de l'exécution d'une commande comme celle-ci. Sinon, cela peut entraîner l'erreur:Expressions are only allowed as the first element of a pipeline
J'ai écrit une petite fonction d'aide pour remplacer du texte dans un fichier:
Exemple:
la source
Lors d'un remplacement récursif, le chemin et le nom de fichier doivent être inclus:
Cela remplacera tous les "anciens" par "nouveaux" sensibles à la casse dans tous les fichiers de vos dossiers de votre répertoire actuel.
la source