Làm cách nào để sửa đổi / tạo giá trị trong các tệp XML bằng PowerShell?


24

Tôi muốn biết liệu có thể sửa đổi / tạo giá trị trong các tệp XML bằng PowerShell hay không. Về cơ bản tôi quan tâm đến:

  • Sửa đổi giá trị trong tệp XML hoặc tạo chúng nếu chúng không tồn tại (nghĩa là tôi cần tìm kiếm mục, tạo nếu không tồn tại và sửa đổi giá trị)
  • Xử lý các cú pháp XML khác nhau trong cùng một tệp XML như các cú pháp sau:

Cú pháp 1:

<cài đặt>
  <cài đặt id = "Location2" value = "Barcelona, ​​Tây Ban Nha" />
  <cài đặt id = "Location2id" value = "zmw: 00000.1.08181" />
</ cài đặt>

Cú pháp 2:

<cài đặt>
    <người chơi nhạc>
        <crossfade> 0 </ crossfade>
        <queuebydefault> sai </ queuebydefault>
    </ người chơi nhạc>
</ cài đặt>

Cú pháp 3:

<cài đặt>
    <cài đặt giao diện>
        <settings type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </ settings>
    </ skin settings>
</ cài đặt>

Bất kỳ trợ giúp sẽ được rất đánh giá cao.

Cảm ơn.

Câu trả lời:


36

PowerShell hỗ trợ đầy đủ việc xử lý các tệp XML.

Ví dụ: nếu chúng tôi lấy bản blurb đầu tiên bạn cung cấp và chỉ cần dán nó vào tệp XML có tên settings.xmltrong thư mục "C: \ blah", bạn có thể lấy ID của từng cài đặt như sau:

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

Trả về:

Location2
Location2id

$myXML.settings.setting.value

trả về:

Barcelona, Spain
zmw:00000.1.08181

Nếu chúng tôi thay thế nội dung tệp XML bằng blurb bạn đã cung cấp trong Cú pháp # 2:

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

trả về:

0

Để đọc crossfade, thay đổi nó (thành 2) và lưu lại:

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

Chỉnh sửa sau khi bình luận:

Để tự thay đổi các phần tử XML (như trong ví dụ Barcelona) khó hơn một chút, bởi vì bạn đang chỉnh sửa chính cấu trúc XML chứ không phải dữ liệu chứa trong đó.

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

Đối với ví dụ về Skinsinstall, hãy thử một cái gì đó như:

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

Kiểm tra các tài nguyên sau:


Cảm ơn câu trả lời. Tôi đã đọc các đề xuất của bạn và tôi đang cố cập nhật giá trị của id = "Location2" trong blob đầu tiên từ Barcelona đến New York nhưng không thành công. Tương tự với blob thứ ba (cố gắng thay đổi thành "true"). Làm cách nào tôi có thể tìm / sửa đổi các loại giá trị này?
Serieofilo

Tôi đang cố gắng chọn nút tôi muốn thay đổi bằng cách sử dụng sau đây $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']"), nhưng làm cách nào tôi có thể thay đổi giá trị từ "false" thành "true". Hoặc làm thế nào tôi có thể tạo một nút như thế này nếu nó không tồn tại?
Serieofilo

1
Kiểm tra chỉnh sửa của tôi. Tôi đã thêm một số thông tin. :)
cʜιᴇ007
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.