- forum
- PowerShell
- Entraide pour les débutants
- Insérer une ligne de texte, à plusieurs endroits dans un fichier.
Question
Insérer une ligne de texte, à plusieurs endroits dans un fichier.
- Rudy
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 7
- Remerciements reçus 0
Je vous donne le contexte. J'ai une application que je dois mettre à jour en gardant le fichier de configuration. Cette application contient différents modules. Chaque module a une fonction "Send", et après avoir installé la nouvelle version, je voudrais reprendre mon fichier de configuration mais y ajouter une ligne pour chaque module.
Le fichier de config est un XML. et donc dans ce fichier config.xml, j'ai plusieurs fois cette section:
<TargetDLL>SendRegistration.dll</TargetDLL>
<PluginSettings>
...
...
...
</PluginSettings>
Et donc, entre ces deux balises <PluginSettings></PluginSettings> qui suivent le <Targetdll>sendregistration.dll</targetdll>, je voudrais insérer une ligne contenant un nouveau paramètre ... je n'ai aucune idée de comment le faire. Je suppose que la commande 'add-content' sera mon amie, mais ma compréhension de comment faire s'arrête à peu près là ... donc ... déjà merci à l'équipe
Rudy
Merci pour le coup de main !
Connexion ou Créer un compte pour participer à la conversation.
- Fabien
- Hors Ligne
- Membre premium
- Messages : 140
- Remerciements reçus 20
Peux-tu me transmettre un exemple de fichier XML source et l'exemple de fichier XML de sortie ?
Connexion ou Créer un compte pour participer à la conversation.
- Rudy
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 7
- Remerciements reçus 0
Déjà, merci de m'aider. Je ne peux malheureusement pas partager le fichier en question dans son intégralité pour des raisons de propriété intellectuelle, mais en substance, cet extrait devrait être suffisant : (j'ai dû enlever certains morceaux ... désolé ... )
Voici mon fichier de départ ... Cette section se répète plusieurs fois :
<Registration>
<RegistrationName>Module1</RegistrationName>
<Modules>
<RegistrationElement>
<TargetDLL>AlphaBE.dll</TargetDLL>
<TargetClass>UcPluginTpAlphaBE</TargetClass>
<Text>Case details</Text>
<LanguageKey>CaseInput</LanguageKey>
<ImageIcon>pack://application:,,,/Presentation;component/resources/images/32/notebook.png</ImageIcon>
<PluginSettings>
</PluginSettings>
</RegistrationElement>
<RegistrationElement>
<TargetDLL>Capture.dll</TargetDLL>
<TargetClass />
<LanguageKey>Capture</LanguageKey>
<ImageIcon>pack://application:,,,/UiClient.Interfaces;component/resources/images/scan.png</ImageIcon>
<PluginSettings>
<Setting Key="DefaultScanSequence" Type="String" Value="13,11,0,1,2,3,4,25,22,14,12,5,6,7,8,9,27,24" />
<Setting Key="ShowRescanWarning" Type="Bool" Value="True" />
<Setting Key="DoQualityCheckForscans" Type="Bool" Value="False" />
<Setting Key="SetMissingpartsToNAMsgBox" Type="Bool" Value="True" />
<Setting Key="IgnoreRecommendedRescan" Type="Bool" Value="True" />
<Setting Key="DisplayScanCancelWarning" Type="Bool" Value="True" />
<Setting Key="CallbackUri" Type="String" Value="assembly:BeCallbackPugin.dll;type:OnCancelActionPlugin.BeCallbackPugin" />
<Setting Key="UseErrorBeep" Type="Bool" Value="True" />
<Setting Key="ShowRescanButton" Type="Bool" Value="False" />
</PluginSettings>
</RegistrationElement>
<RegistrationElement>
<TargetDLL>SendRegistration.dll</TargetDLL>
<TargetClass />
<Text>Send transaction</Text>
<LanguageKey>SendCase</LanguageKey>
<ImageIcon>pack://application:,,,/Presentation;component/Resources/Images/32/mail_send.png</ImageIcon>
<PluginSettings>
<Setting Key="NistTemplate" Type="String" Value="apfis.be-BE.xml" />
<Setting Key="StoreToDataAccessLayer" Type="String" Value="OnSuccess" />
<Setting Key="ViewInCaseLogButtonText" Type="String" Value="Go to caselog" />
<Setting Key="ViewInCaseLogField" Type="String" Value="" />
<Setting Key="PrintDialogType" Type="String" Value="Standard" />
<Setting Key="ActiveSendPlugins" Type="String" Value="FitPlus.AfisSender.dll;" />
<Setting Key="AllowPrintImageExport" Type="Bool" Value="True" />
<Setting Key="DisableSendButtonAfterSend" Type="Bool" Value="True" />
<Setting Key="PrintDialogDisplay" Type="String" Value="Embedded" />
<Setting Key="PrintImageExportForceGrayscale" Type="Bool" Value="True" />
<Setting Key="SendValidation" Type="String" Value="False" />
<Setting Key="NewCase" Type="String" Value="promptonsuccess" />
<Setting Key="RecreateExisting" Type="String" Value="alphaonly" />
</PluginSettings>
</RegistrationElement>
</Modules>
</Registration>
Voici à quoi il devrait ressembler après exécution du script :
<Registration>
<RegistrationName>Module1</RegistrationName>
<Modules>
<RegistrationElement>
<TargetDLL>AlphaBE.dll</TargetDLL>
<TargetClass>UcPluginTpAlphaBE</TargetClass>
<Text>Case details</Text>
<LanguageKey>CaseInput</LanguageKey>
<ImageIcon>pack://application:,,,/Presentation;component/resources/images/32/notebook.png</ImageIcon>
<PluginSettings>
</PluginSettings>
</RegistrationElement>
<RegistrationElement>
<TargetDLL>Capture.dll</TargetDLL>
<TargetClass />
<LanguageKey>Capture</LanguageKey>
<ImageIcon>pack://application:,,,/UiClient.Interfaces;component/resources/images/scan.png</ImageIcon>
<PluginSettings>
<Setting Key="DefaultScanSequence" Type="String" Value="13,11,0,1,2,3,4,25,22,14,12,5,6,7,8,9,27,24" />
<Setting Key="ShowRescanWarning" Type="Bool" Value="True" />
<Setting Key="DoQualityCheckForscans" Type="Bool" Value="False" />
<Setting Key="SetMissingpartsToNAMsgBox" Type="Bool" Value="True" />
<Setting Key="IgnoreRecommendedRescan" Type="Bool" Value="True" />
<Setting Key="DisplayScanCancelWarning" Type="Bool" Value="True" />
<Setting Key="CallbackUri" Type="String" Value="assembly:BeCallbackPugin.dll;type:OnCancelActionPlugin.BeCallbackPugin" />
<Setting Key="UseErrorBeep" Type="Bool" Value="True" />
<Setting Key="ShowRescanButton" Type="Bool" Value="False" />
</PluginSettings>
</RegistrationElement>
<RegistrationElement>
<TargetDLL>SendRegistration.dll</TargetDLL>
<TargetClass />
<Text>Send transaction</Text>
<LanguageKey>SendCase</LanguageKey>
<ImageIcon>pack://application:,,,/Presentation;component/Resources/Images/32/mail_send.png</ImageIcon>
<PluginSettings>
<Setting Key="NistTemplate" Type="String" Value="apfis.be-BE.xml" />
<Setting Key="StoreToDataAccessLayer" Type="String" Value="OnSuccess" />
<Setting Key="ViewInCaseLogButtonText" Type="String" Value="Go to caselog" />
<Setting Key="ViewInCaseLogField" Type="String" Value="" />
<Setting Key="PrintDialogType" Type="String" Value="Standard" />
<Setting Key="ActiveSendPlugins" Type="String" Value="FitPlus.AfisSender.dll;" />
<Setting Key="AllowPrintImageExport" Type="Bool" Value="True" />
<Setting Key="DisableSendButtonAfterSend" Type="Bool" Value="True" />
<Setting Key="PrintDialogDisplay" Type="String" Value="Embedded" />
<Setting Key="PrintImageExportForceGrayscale" Type="Bool" Value="True" />
<Setting Key="SendValidation" Type="String" Value="False" />
<Setting Key="NewCase" Type="String" Value="promptonsuccess" />
<Setting Key="RecreateExisting" Type="String" Value="alphaonly" />
<Setting Key="AutomaticMode" Type="Bool" Value="True" />
</PluginSettings>
</RegistrationElement>
</Modules>
</Registration>
Et ceci se répète plusieurs fois ... Comme je l'indiquais dans mon post précédent, la balise "<TargetDLL>SendRegistration.dll</TargetDLL>" se répète pour chaque module concerné ... et cette ligne (en évidence) doit être positionnée dans la section <PluginSettings> sous cette balise ""<TargetDLL>SendRegistration.dll</TargetDLL>""
Rudy
Merci pour le coup de main !
Connexion ou Créer un compte pour participer à la conversation.
- Fabien
- Hors Ligne
- Membre premium
- Messages : 140
- Remerciements reçus 20
Désolé pour la réponse tardive, pas mal de taf en ce moment.
Voici le script que tu peux exécuter pour modifier ton fichier XML.
#Chemin du fichier XML
$Fichier_xml = "C:\Temp\Test\Logs.xml"
#Récupération du contenu
$booksXml = [xml](Get-Content $Fichier_xml)
#Ajouter les données dans le fichier XML
#Création d'un nouveau noeud
$NewNode = $booksXml.CreateNode("element","Setting",$null)
#Ajout des attributs dans le noeud
$NewNode.SetAttribute("Key","AutomaticMode")
$NewNode.SetAttribute("Type","Bool")
$NewNode.SetAttribute("Value","True")
#Sélectionner l'emplacement cible pour l'ajout
$cible = $booksXml.SelectsingleNode("//RegistrationElement[TargetDLL='SendRegistration.dll']/.//PluginSettings")
#Insertion de l'élément à la fin de la cible
$cible.AppendChild($NewNode)
#Écriture du fichier sur le disque
$booksXml.Save($Fichier_xml)
Ceci est à adapter en fonction de ton besoin.
Je suis disponible si tu as besoin de plus de détail.
Bonne journée
Connexion ou Créer un compte pour participer à la conversation.
- Rudy
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 7
- Remerciements reçus 0
Rudy
Merci pour le coup de main !
Connexion ou Créer un compte pour participer à la conversation.
- Rudy
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 7
- Remerciements reçus 0
Donc, je vérifie la présence du setting ... si il est présent dans chacun des plugins, rien n'est modifié. Si il est manquant dans un des plugins, le setting est ajouté.
Voici le code final
# Chemin du fichier XML
$Fichier_xml = "C:\Temp\Test\registrations.xml"
# Vérifie si le fichier existe
if (-Not (Test-Path $Fichier_xml)) {
Write-Error "Le fichier XML spécifié n'existe pas : $Fichier_xml"
exit
}
# Récupération du contenu
$booksXml = [xml](Get-Content $Fichier_xml)
# Sélectionner tous les emplacements cibles pour l'ajout
$registrationElements = $booksXml.SelectNodes("//RegistrationElement[TargetDLL='FitWpf.SendRegistration.dll']")
if ($registrationElements.Count -eq 0) {
Write-Error "Aucun emplacement cible n'a été trouvé dans le fichier XML."
exit
}
# Parcourir chaque RegistrationElement
foreach ($registrationElement in $registrationElements) {
$pluginSettings = $registrationElement.PluginSettings
# Vérifier si le nœud Setting avec Key=AutomaticMode existe déjà
$settingExists = $false
foreach ($setting in $pluginSettings.SelectNodes("Setting[@Key='AutomaticMode']")) {
$settingExists = $true
break
}
# Ajouter le nouveau nœud si nécessaire
if (-not $settingExists) {
$NewNode = $booksXml.CreateElement("Setting")
$NewNode.SetAttribute("Key", "AutomaticMode")
$NewNode.SetAttribute("Type", "Bool")
$NewNode.SetAttribute("Value", "True")
$pluginSettings.AppendChild($NewNode)
Write-Output "Nouveau nœud ajouté avec succès à PluginSettings dans RegistrationElement avec TargetDLL='FitWpf.SendRegistration.dll'."
}
else {
Write-Output "Le nœud avec Key=AutomaticMode existe déjà dans PluginSettings dans RegistrationElement avec TargetDLL='FitWpf.SendRegistration.dll'."
}
}
# Écriture du fichier sur le disque
$booksXml.Save($Fichier_xml)
Il me reste à découvrir maintenant comment faire pour que mon output affiche les accents et ne me mettent pas des caractères bizarres (par exemple déjà au lieu de déjÃ)
Rudy
Merci pour le coup de main !
Connexion ou Créer un compte pour participer à la conversation.
- forum
- PowerShell
- Entraide pour les débutants
- Insérer une ligne de texte, à plusieurs endroits dans un fichier.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Insérer une ligne de texte, à plusieurs endroits dans un fichier.