我目前正在编写一个脚本来扫描服务器列表并检查某个REG_SZ注册表值。我的代码完美无缺,直到我需要读取(默认)值。
实施例
$regValue = (Get-RegString -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\control.ini" -Value Current).data
这会返回好的数据。
$regValue = (Get-RegString -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini" -Value Default).data
返回"找不到值[Default],因为它不存在。
$regValue = (Get-RegString -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini" -Value "(Default)").data
返回"找不到值[(默认值)],因为它不存在。
我可以使用其他方法来获取值。
答案 0 :(得分:2)
PSRemoteRegistry模块实际上包含一个专门用于检索注册表项默认值的命令:Get-RegDefault
使用您的示例,命令和结果输出:
PS C:\WINDOWS\system32> (Get-RegDefault -Hive LocalMachine -Key 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini').Data
USR:软件\微软\ RegEdt32中
使用Get-RegDefault
时可能存在问题,这是“(默认)”键值根本没有数据集时引发的错误:
PS C:\WINDOWS\system32> (Get-RegDefault -Hive LocalMachine -Key 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping').Data
Get-RegDefault:使用“1”参数调用“GetValueKind”的异常:“指定的注册表项不存在。”
在行:1 char:2
+(Get-RegDefault -Hive LocalMachine -Key'SOFTWARE \ Microsoft \ Windows N ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:NotSpecified:(:) [Write-Error],WriteErrorException
+ FullyQualifiedErrorId:Microsoft.PowerShell.Commands.WriteErrorException,Get-RegDefault
一个相当简单的解决方法是简单地使用-ErrorAction SilentlyContinue
来抑制错误,因为它是非终止的,但不建议这样做。
“(默认)”注册表项值的名称实际上是空的。原始命令返回有关不存在的值的错误的原因是因为确实没有名称为“(默认)”的键值,除非您可能创建了一个。
因此,检查密钥默认值的最简单,最简洁的方法是使用Get-RegValue
命令并传递一个空字符串作为值名称。
此示例显示了找到包含数据的合法“(默认)”值时的结果:
PS C:\WINDOWS\system32> (Get-RegValue -Hive LocalMachine -Key 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping\RegEdt32.ini' -Value '').Data
USR:Software \ Microsoft \ RegEdt32
以下是使用之前产生错误的密钥的示例:
PS C:\WINDOWS\system32> (Get-RegValue -Hive LocalMachine -Key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\InifileMapping" -Value '').Data
您可以看到根本没有返回任何内容,因为该键的“默认”值没有数据。作为奖励,如果密钥本身确实不存在,那么您仍然可以通过不抑制错误来检测它。
答案 1 :(得分:0)
如果您没有专门与Get-RegString绑定,则可以使用来自同一PSRemoteRegistry模块的Get-RegValue。如果需要,您可以使用'-type String'参数将其限制为字符串。
您只需将其指向存在默认值的键即可。要测试的示例工作流程:
#Stage a key to test:
#Create a 'blah' key under HKLM\Software.
#Change the default value to some desired value.
#Get the default value (assumes no other values exist under this key)
(Get-RegValue -Hive LocalMachine -Key SOFTWARE\blah).data
#Get the default value, accounting for other potential values
Get-Regvalue -Hive LocalMachine -Key SOFTWARE\Blah | Where-Object {$_.value -like "(Default)"} | Select-Object -ExpandProperty data
#Get the default value, limited to string type:
(get-RegValue -Hive LocalMachine -Key SOFTWARE\blah -Type String).data
干杯!