1. 处理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

systemLanguage
--------------

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
  1. 注册表里有些键比较特殊,它里面包含一个Default项,如下图所示。如果想用PowerShell取这个值,要格外注意,PowerShell自带的注册表访问方法是没法访问到这个值的,这是个Bug, 我试了无数种访问方法,都不行,目测是(默认)和 (Default)这俩键值造成的冲突。


解决办法只能是改用CMD的方式,用reg命令解决,如下所示。

1
reg Query HKLM\System\CurrentControlSet\Control\Nls\Locale\ /v "(Default)"

注意要先括号再引号