Modification des données d'une balise dans un fichier XML à l'aide du fichier Windows batch

j'ai un fichier XML avec plusieurs balises, et je suis en train de changer le contenu d'une de ces balises avec un script batch.

un exemple du fichier xml est:

<ConfigurationData>
<ReportsFolder>Reports</ReportsFolder>
<Helpfolder>Help</HelpFolder>
<InstallationType>Terminal</InstallationType>
<LicenseFolder>..License</LicenseFolder>
</ConfigurationData>

j'essaie de changer les données entre <InstallationType> et </InstallationType> à une autre variable de mon choix. Je pense que j'aurais besoin d'une sorte de boucle for Pour trouver la partie du fichier xml, mais je suis perdu comment je voudrais modifier une seule section.

3
demandé sur user2382144 2013-06-12 01:38:11

3 réponses

vous devriez vraiment utiliser un outil qui est conçu spécifiquement pour manipuler XML.

mais dans une pincée, vous pourriez utiliser n'importe quel outil qui peut faire une recherche regex et remplacer pour faire une solution naïve qui fonctionnerait avec le fichier comme vous l'avez prévu, mais pourrait échouer avec un fichier XML logiquement équivalent qui a eu la disposition physique réarrangé.

j'aime utiliser un utilitaire JScript/batch hybride que j'ai écrit appelé REPL.MTD à manipulez les fichiers texte via des scripts de traitement par lots. Le script s'exécute sur N'importe quelle machine Windows native à partir de XP, et il ne nécessite pas l'installation d'exécutables tiers. Cliquez sur le lien pour obtenir le code du script et une description plus détaillée.

utilisant REPL.BAT, une solution rapide et efficace mais naïve est aussi simple que:

setlocal enableDelayedExpansion
set "newValue=myNewValue"
type "fileName.xml"|repl "(<InstallationType>).*(</InstallationType>)" "!newValue!" >fileName.xml.new
move /y "fileName.xml.new" "fileName.xml"
12
répondu dbenham 2017-05-23 12:32:10
@echo off
setlocal EnableDelayedExpansion

set anotherVariable=New value

(for /F "delims=" %%a in (theFile.xml) do (
   set "line=%%a"
   set "newLine=!line:InstallationType>=!"
   if "!newLine!" neq "!line!" (
      set "newLine=<InstallationType>%anotherVariable%</InstallationType>"
   )
   echo !newLine!
)) > newFile.xml

sortie avec votre exemple de données:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>
8
répondu Aacini 2013-06-11 22:17:28

GNU sed

sed "/InstallationType/s/>[^<]*</>New Value</" file.xml

..sortie:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New Value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>
0
répondu Endoro 2013-06-12 03:47:18