2012-02-10 35 views
6

Tôi đang sử dụng PowerShell để cập nhật danh sách thư mục XML cho một ứng dụng trên một số máy chủ nhưng gặp sự cố khi thực hiện cập nhật thực tế. Sử dụng XML sau đây làm ví dụ, tìm cách cập nhật các filepaths với qualnas1 để sử dụng một cái gì đó như \ GlobalNAS ... vv và loại bỏ mục nhập qualnas2.Cập nhật các tệp XML bằng PowerShell

<?xml version="1.0" encoding="UTF-8" ?> 
<directory> 
    <filepath>\\qualnas1\library\content</filepath> 
    <filepath>\\qualnas2\library\content</filepath> 
    <filepath type="sssb">\\qualnas1\SSSB\content</filepath> 
</directory> 

Nút filepath với type = sssb hoạt động khi tôi sử dụng $ _. InnerText, nhưng không thể tìm cách cập nhật hoặc xóa các nút khác. Đây là mã của tôi:

$DirectoryXMLPath = 'C:\Temp\directory.xml' 
if (Test-Path $DirectoryXMLPath) 
{ 
    $DirectoryXML = New-Object XML 
    $DirectoryXML.Load($DirectoryXMLPath) 
    $DirectoryXML.PreserveWhitespace = $true 

    # Find qualnas1 path and replace with GlobalNAS 
    $DirectoryXML.directory.filepath | Where-Object { $_ -eq '\\qualnas1\library\content' } | 
     ForEach-Object { $_.InnerText = '\\GlobalNAS\library\content' } 

    # Find extraneous library paths and remove them 
    $DirectoryXML.directory.filepath.Remove('\\qualnas2\library\content') 
# $DirectoryXML.directory.mountpoint | Where-Object { $_ -eq '\\qualnas2\library\content' } | 
#  ForEach-Object { $DirectoryXML.RemoveChild($_) } 

    # This line is good! Need InnerText as attribute type exists 
    $DirectoryXML.directory.filepath | Where-Object { $_.InnerText -eq '\\qualnas1\SSSB\content' } | 
     ForEach-Object { $_.InnerText = '\\GlobalNAS\SSSB\content' } 
} 

Nếu tôi bước qua mã bằng PowerGUI mỗi nút được tìm thấy và thay thế/remove được cố gắng như tôi mong đợi, nhưng một trong hai nhận được lỗi (string để chuyển đổi XmlElement) hoặc không có lỗi nhưng không có bản cập nhật nào tùy thuộc vào cách tôi thực hiện bài tập. Dù sao để thay đổi/loại bỏ các nút cụ thể nếu không có thuộc tính như trong ví dụ SSSB?

+0

Lưu ý: PreserveWhitespace phải được đặt trước khi tải(). http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx – NYCdotNet

Trả lời

5

Tôi sẽ sử dụng một chút Xpath để xử lý các nút XML. Đối với tôi, việc sử dụng các thuộc tính mà PowerShell tạo cho các nút XML trở nên dễ dàng hơn.

# Find qualnas1 path and replace with GlobalNAS 
$DirectoryXML.SelectNodes('/directory/filepath') | ? { 
     $_.InnerText -eq '\\qualnas1\library\content' 
    } | % { 
     $_.InnerText = '\\GlobalNAS\library\content' 
    } 

# Find extraneous library paths and remove them 
$DirectoryXML.SelectNodes('/directory/filepath') | ? { 
     $_.InnerText -eq '\\qualnas2\library\content' 
    } | % { 
     $_.ParentNode.RemoveChild($_) 
    } 
+0

Cảm ơn - Tôi sẽ thử và cho bạn biết cách nó diễn ra. – AndyDrav

+2

Andy - cắm nó vào mã của tôi và làm việc tuyệt vời. Cảm ơn đã giúp đỡ! – AndyDrav

Các vấn đề liên quan