- 处理XML时,PowerShell支持直接以对象的方式访问节点,像这样
1 2 3 4 5 6 7 8 9 10 11 12 13
| <report> <baseInfo> <systemLanguage>zh-CN</systemLanguage> </baseInfo> <error> </error> </report>
PS C:\Users\Woody> $xmlObj.report.baseInfo
-------------- zh-CN
|
但如果目标节点是没有子级,这样取到的节点类型不是xmlnode,而是object,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12
| PS C:\Users\Woody> $test.report.baseInfo.systemlanguage.getType()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
PS C:\Users\Woody> $test.report.baseInfo.getType()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False XmlElement System.Xml.XmlLinkedNode
|
所以,如果想给一个空的节点添加子节点就不能这样写,因为没有对应方法,应该用selectNodes代替,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| PS C:\Users\Woody> $test.report.selectnodes("error").item(0).gettype()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False XmlElement System.Xml.XmlLinkedNode
PS C:\Users\Woody> $test.report.error.gettype()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
PS C:\Users\Woody> $test.report.error.appendChild ##没反应,表示不存在## PS C:\Users\Woody> $test.report.selectnodes("error").item(0).appendChild
MemberType : Method OverloadDefinitions : {System.Xml.XmlNode AppendChild(System.Xml.XmlNode newChild)} TypeNameOfValue : System.Management.Automation.PSMethod Value : System.Xml.XmlNode AppendChild(System.Xml.XmlNode newChild) Name : AppendChild IsInstance : True
|
- 注册表里有些键比较特殊,它里面包含一个Default项,如下图所示。如果想用PowerShell取这个值,要格外注意,PowerShell自带的注册表访问方法是没法访问到这个值的,这是个Bug, 我试了无数种访问方法,都不行,目测是(默认)和 (Default)这俩键值造成的冲突。
解决办法只能是改用CMD的方式,用reg命令解决,如下所示。
1
| reg Query HKLM\System\CurrentControlSet\Control\Nls\Locale\ /v "(Default)"
|
注意要先括号再引号