Jak modyfikować / tworzyć wartości w plikach XML za pomocą PowerShell?

24

Chciałbym wiedzieć, czy można modyfikować / tworzyć wartości w plikach XML za pomocą programu PowerShell. Zasadniczo jestem zainteresowany:

  • Zmodyfikuj wartości w pliku XML lub utwórz je, jeśli nie istnieją (tzn. Muszę wyszukać element, utworzyć, jeśli nie istnieje i zmodyfikować wartość)
  • Postępuj z inną składnią XML w tym samym pliku XML, jak te:

Składnia 1:

<ustawienia>
  <ustawienie id = „Lokalizacja2” wartość = „Barcelona, ​​Hiszpania” />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</settings>

Składnia 2:

<ustawienia>
    <musicplayer>
        <crossfade> 0 </crossfade>
        <queuebydefault> false </queuebydefault>
    </musicplayer>
</settings>

Składnia 3:

<ustawienia>
    <ustawienia skórki>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </setting>
    </skinsettings>
</settings>

Każda forma pomocy jest mile widziana.

Dzięki.

Serieofilo
źródło

Odpowiedzi:

36

PowerShell w pełni obsługuje obsługę plików XML.

Na przykład, jeśli weźmiemy pierwszy napis, który podałeś, i po prostu wkleisz go do pliku XML o nazwie settings.xmlw folderze „C: \ blah”, możesz uzyskać identyfikator każdego ustawienia jako taki:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.setting.id

Które zwraca:

Location2
Location2id

I

$myXML.settings.setting.value

zwroty:

Barcelona, Spain
zmw:00000.1.08181

Jeśli zastąpimy zawartość pliku XML napisem podanym w Składni # 2:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.musicplayer.crossfade

zwroty:

0

Aby przeczytać crossfade, zmień go (na 2) i zapisz:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.musicplayer.crossfade = 2
$myXML.Save("C:\blah\settings.xml")

Edytuj po komentarzach:

Zmiana samych elementów XML (jak w przykładzie z Barcelony) jest nieco trudniejsza, ponieważ edytujesz samą strukturę XML, a nie dane w niej zawarte.

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.ChildNodes.Item(0).value = "New York, USA"
$myXML.Save("C:\blah\settings.xml")

Na przykład w ustawieniach skór wypróbuj coś takiego:

$myXML.settings.skinsettings.setting."#text" = "true"

Sprawdź te zasoby:

Ƭᴇcʜιᴇ007
źródło
Dziękuję za odpowiedź. Przeczytałem twoje sugestie i staram się zaktualizować wartość id = "Location2" w pierwszym obiekcie blob z Barcelony do Nowego Jorku bez powodzenia. To samo dotyczy trzeciego obiektu blob (próbującego zmienić się na „prawda”). Jak mogę znaleźć / zmodyfikować tego rodzaju wartości?
Serieofilo,
Próbuję wybrać węzeł, który chcę zmienić, korzystając z poniższych $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']")instrukcji, ale jak mogę zmienić wartość z „false” na „true”. Lub jak mogę utworzyć taki węzeł, jeśli nie istnieje?
Serieofilo,
1
Sprawdź moją edycję. Dodałem więcej informacji. :)
ᴇcʜιᴇ007