【题外话】国庆几天都去玩了,一方面是没多少时间,另外一方面也确实遇到了些困难(呵呵不知道怎么样提取出winrar的路径了),不过好在今天终于可以继续:)
我可以用这个方式得到“test”的值:
1. $s = gp hklm:/Software/Classes/WinRAR/shell/open/command
2. $s.test
但是对默认值不知道该怎么办,试了一下,无论用 $s.default 还是 $s.(default) 都不可以,不知道哪位高人可以指点下。
研究了一番,想了另外一招,如下:
1. $s = gp hklm:/Software/Classes/WinRAR/shell/open/command | Get-Member –membertype noteproperty
2. $a= $s[0].Definition.Split(‘”’)
3. $b = $a[1].ToUpper().replace(“WINRAR.EXE”, “UNRAR.EXE”)
最后$b里存放的就是unrar.exe的具体路径。
大概解释一下代码吧:
Get-Member 可以拿到一个 object 里面的所有成员, 如果执行
$s = gp hklm:/Software/Classes/WinRAR/shell/open/command
$s.GetType()
你会看到 $s 是 PSCustomObject 类型的。打印 $s (直接敲 $s 然后回车) 可以看到它包括了若干属性。加上 –membertype参数主要是因为路径所在的属性是 "noteproperty"。
经过 Get-Member 后会得到若干个属性的集合,其中第一个是包含了路径的(我们的兴趣所在),包含在它的Definition段,这个段的值大致是这样: System.String (default)="d:/winrar/winrar.exe" "%1"
所以接下来我用 Split 函数将其分割开并放到一个数组里,使用双引号为分隔符,结果数组里第二个元素就是 d:/winrar/winrar.exe,然后要把 winrar.exe 替换为 unrar.exe 就好(先做一个转为大写是为了确保替换的源字符串是 WINRAR.EXE)。
【又及】今天读了 Manning Windows PowerShell in Action,做了个凌乱的笔记,也附在blog里作为参考。