Le code dans votre commentaire est proche, mais a juste quelques problèmes de syntaxe. Il commence fort:
$mabyIni = "C:\New\Path"
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse
ForEach($file in $AiniFile) {
Jusqu'ici, tout va bien. Vous définissez le nouveau chemin, et vous obtenez une liste de fichiers .ini dans l'ancien chemin, puis vous commencez à parcourir ces fichiers. C'est tout bon code jusqu'à présent. Alors les choses commencent à s'égarer.
Je vois que vous essayez d'obtenir le contenu de chaque fichier .ini, remplacez la chaîne en question, puis sortie ce fichier vers le nouveau chemin avec ceci:
(Get-Content $AiniFile.PSPath) | ForEach-Object {
$file -replace [regex]:Escape('C:\A\Path'),('$mabyIni')
}| Set-Content $mabyIni -include *.ini
Malheureusement vous utilisez les mauvaises variables, et en ajoutant une boucle supplémentaire ForEach
là aussi. Commençons par la ligne Get-Content
. À ce stade du script, vous parcourez les fichiers en boucle, chaque fichier en cours étant représenté par $file
. Donc, ce que vous voulez vraiment obtenir le contenu est $file
, et non $AiniFile.PSPath
.
(Get-Content $file)
Ok, cela nous a donné le contenu de ce fichier sous la forme d'un tableau de chaînes. Maintenant, je suppose que vous n'étiez pas au courant, mais l'opérateur -Replace
travaille sur des tableaux de chaînes. Parfait, nous avons juste obtenu une série de cordes! Étant donné que la commande Get-Content
est placée entre parenthèses, elle se termine en premier, nous pouvons simplement ajouter la commande -Replace
juste après.
(Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni
Votre commande -replace
que vous aviez était super proche! En fait, je dois vous donner des accessoires pour l'utilisation [regex]::escape()
là. C'est totalement un geste pro, bien fait! Le seul problème est que la chaîne de remplacement n'a pas besoin d'être entre parenthèses, et elle était simple, donc elle n'aurait pas développé la chaîne et vos fichiers .ini auraient tous une ligne comme:
AIniText = $mabyIni\AIniText
Pas exactement ce que vous vouliez je devine, alors j'ai enlevé la parenthèse (ils ne faisaient pas de mal, mais n'aidaient pas non plus, donc pour la propreté et la simplicité je me suis débarrassé d'eux), et je me suis débarrassé guillemets simples '
aussi bien que nous voulons vraiment juste la chaîne qui est stockée dans cette variable.Donc, maintenant nous parcourons les fichiers en boucle, en lisant le contenu, en remplaçant l'ancien chemin avec le nouveau chemin, tout ce qui reste est de sortir le nouveau fichier .ini. On dirait qu'ils sont déjà en place, donc nous utilisons simplement le chemin existant pour le fichier, et définissons le contenu aux données mises à jour.
(Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName
Ok, c'est fait! Il vous suffit de fermer la boucle ForEach
et de l'exécuter.
$mabyIni = "C:\New\Path"
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse
ForEach($file in $AiniFile) {
(Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName
}
Il devrait rechercher dans le fichier ini le chemin et le remplacer par le nouveau. J'ai essayé aussi: $ mabyIni = "C: \ Nouveau \ Chemin" $ AiniFile = Get-ChildItem - Chemin d'accès "C: \ Nouveau \ Chemin \ *" -include * .ini -recurse ForEach ($ file dans $ AiniFile) { (Get-Content $ AiniFile.PSPath) | PourEach-Opject {$ file -replace [regex]: Echap ('C: \ A \ Chemin'), ('$ mabyIni')} | Set-Content $ mabyIni -include * .ini – Mkey
Vous devez mettre à jour votre question et ne pas poster de commentaire. Le code dans votre commentaire est vraiment difficile à lire. Peu importe, je vois le problème avec le code dans votre commentaire, et je vais écrire une réponse pour expliquer pourquoi cela n'a pas fonctionné. – TheMadTechnician