PowerShell 操作 xml
PowerShell作为优秀的服务器管理脚本,操作文件的能力还是非常出色的。XML文件作为最为常见的的系统配置文件,PowerShell 对于 xml 文件操作的支持也是非常强大的。PowerShell 如果希望将 xml 仅仅作为普通的文档处理,只需要使用 Get-Content 命令即可,但是如果系统将 xml 文件作为 xml 来处理(使用操作 xml)的方法,那么我们就需要使用 Get-Content,并且需要将获取的内容强制转化为 xml 类型。 这是按照普通文档类型输出的情况。 <span style="font-family:微软雅黑;">Windows PowerShell 版权所有 (C) 2009 Microsoft Corporation。保留所有权利。 PS C:Usersgablet> Get-Content "D:PowerShellBooks.xml" <?xml version="1.0" encoding="ISO-8859-1"?> <Books> <Book year="2011" press="CN">C#</Book> <Book year="2012" press="EN">Java</Book> </Books> PS C:&;/span><span style="font-family:微软雅黑;">Usersgablet></span> 如果是按照XML来获取,效果如下: PS C:Usersgablet> [Xml]$XmlContent = Get-Content "D:PowerShellBooks.xml" PS C:Usersgablet> [Xml]$XmlContent xml Books --- ----- version="1.0" encoding="ISO-8859-1" Books PS C:Usersgablet> 这时候我们发现,我们得到的是一个xml对象,我们可以访问节点的值。 PS C:Usersgablet> $XmlContent.Books Book ---- {Book,Book} PS C:Usersgablet> $XmlContent.Books.Book[0] year press #text ---- ----- ----- 2011 CN C# PS C:Usersgablet> $XmlContent.Books.Book[1] year press #text ---- ----- ----- 2012 EN Java PS C:Usersgablet> $XmlContent.Books.Book[0].year 2011 PS C:Usersgablet> $XmlContent.Books.Book[0].press CN PS C:Usersgablet> 怎么样,确实很方便吧? 我们可以直接更新节点的值,示例如下: PS C:Usersgablet> $XmlContent.Books.Book[0].year = "2014" PS C:Usersgablet> $XmlContent.Books.Book[0].year 2014 PS C:Usersgablet> $XmlContent.save("D:PowerShellBooks.xml") PS C:Usersgablet> [Xml]$XmlContent = Get-Content "D:PowerShellBooks.xml" PS C:Usersgablet> $XmlContent.Books.Book[0] year press #text ---- ----- ----- 2014 CN C# PS C:Usersgablet> 注意,我们读取之后,xml文件存在于内存中,如果不执行方法,不会写入物理文件中。 上述操作xml文件的方法存在一个缺陷,就是节点的位置不能改变,因为我们是通过节点的位置去更新的,有没有一种不依赖于位置的方法呢?这种方法是存在的。 PS C:Usersgablet> $XmlContent.Books.Book | Where-Object { $_.year -eq "2014"} year press #text ---- ----- ----- 2014 CN C# PS C:Usersgablet> 使用PowerShell 的 Where-Object 实现查找,我们可以进一步使用管道特性,更新这个节点,这里不再赘述。 除了这种方法以外,PowerShell 操作 xml 支持 查询某个路径下的节点。 PS C:Usersgablet> $XmlContent.SelectNodes("Books/Book") year press #text ---- ----- ----- 2014 CN C# 2012 EN Java PS C:Usersgablet> 同样支持根据位置索引来获取节点 PS C:Usersgablet> $XmlContent.SelectNodes("Books/Book[0]") PS C:Usersgablet> $XmlContent.SelectNodes("Books/Book[1]") year press #text ---- ----- ----- 2014 CN C# PS C:Usersgablet> $XmlContent.SelectNodes("Books/Book[2]") year press #text ---- ----- ----- 2012 EN Java PS C:Usersgablet> 注意:这里索引是从1开始的,不是0 还可以获取最后,最开始一个 PS C:Usersgablet> $XmlContent.SelectNodes("Books/Book[last()]") year press #text ---- ----- ----- 2012 EN Java 本章节就介绍到这里,期待继续... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |