2017-07-12 1 views
0

Mon problème est que je veux changer les chemins d'accès dans les fichiers INI enregistrés dans un dossier et dans ses sous-dossiers.Modification de l'INI avec PowerShell

Le chemin du dossier est C:\New\Path\.

Exemple de fichier INI:

 
notAIniText = C:\A\Path\notAIniText 
maybeAIniText = C:\A\Path\maybeAIniText 
AIniText = C:\A\Path\AIniText 

J'ai lu quelques autres questions au sujet PSini mais je ne veux pas simplement id parce que je veux utiliser le script sur plusieurs PC et je ne veux pas installer tous les temps PSIni.

J'ai essayé:

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path\*" -Include *.ini -Recurse 
foreach ($file in $AiniFile) { 
    Select-String -Path $file -AllMatches "C:\A\Path\" | ForEach-Opject { 
     $file -replace [regex]:Escape('C:\A\Path'), ('$mabyIni') 
    } | Set-Content $mabyIni -Include *.ini 

Mais cela ne fonctionne pas. Je l'ai essayé avec Get-Content aussi, mais cela ne fonctionne pas non plus.

Existe-t-il un moyen quelconque sans PSini?

+0

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

+0

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

Répondre

2

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 
}