使用PowerShell创建注册表项:自定义对象、注册表对象还是单独的语句?
我正在尝试编写一个PowerShell脚本,该脚本将创建一组注册表项。我一直在谷歌上搜索StackOverflow,以了解其他人是如何完成这项任务的。似乎大多数人都在求助于使用使用PowerShell创建注册表项:自定义对象、注册表对象还是单独的语句?,powershell,registry,Powershell,Registry,我正在尝试编写一个PowerShell脚本,该脚本将创建一组注册表项。我一直在谷歌上搜索StackOverflow,以了解其他人是如何完成这项任务的。似乎大多数人都在求助于使用newitem和newitemproperty等等(例如,这个问题) 我对其他编码/脚本语言有了更多的经验,我的想法是创建一个对象集合,然后用一条语句或循环导入所有对象,并分别插入每个对象 伪代码: $keys_to_import = { key1: { property1: value1,
newitem
和newitemproperty
等等(例如,这个问题)
我对其他编码/脚本语言有了更多的经验,我的想法是创建一个对象集合,然后用一条语句或循环导入所有对象,并分别插入每个对象
伪代码:
$keys_to_import = {
key1: {
property1: value1,
property2: value2,
},
key2: {
property1: value1,
property2: value2,
},
...
}
Import $keys_to_import
# or
For $key in ($keys_to_import) {
Import $key
}
是否可以通过这种方式创建/导入注册表值?例如,您可以创建一个包含所有需要创建的键和属性的CSV文件。 标量属性可以按原样添加,但对于多字符串和二进制值,必须使用某种方式将它们放入CSV 我选择了以下格式:
- 多字符串:使用分隔符
这样代码就可以在创建字符串数组时拆分分隔不同的字符串
- 二进制:将所有字节作为十六进制数字写入字符串。例如,二进制值
变成
412042696E6172792056616C7565
"Key","Property","Value","Type"
"HKCU:\SOFTWARE\123\Test","MyStringProperty","A String","String"
"HKCU:\SOFTWARE\123\Test","MyDWordProperty","123","DWord"
"HKCU:\SOFTWARE\123\Test","MyQWordProperty","9223372036854775807","QWord"
"HKCU:\SOFTWARE\123\Test","MyBinaryProperty","412042696E6172792056616C7565","Binary"
"HKCU:\SOFTWARE\123\Test","MyMultiStringProperty","String1;String2;String3","MultiString"
"HKCU:\SOFTWARE\123\Test","MyExpandStringProperty","%SystemRoot%\inf","ExpandString"
像这样使用它:
Import-Csv -Path 'D:\Test\NewRegs.csv' | ForEach-Object {
# see https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-itemproperty
# --> Parameters --> Type
$regType = 'String' # default to type String
if ('String','ExpandString','DWord','Qword', 'MultiString', 'Binary' -contains $_.Type) {
$regType = $_.Type
}
# depending on the type of the property, determine the correct value
$value = $_.Value
$value = switch ($regType) {
'DWord' { [int]$value ; break }
'QWord' { [int64]$value ; break }
'MultiString' { [string[]]($value -split ';') ; break }
'Binary' { [byte[]]($value -split '(.{2})' -ne '' -replace '^', '0X') ; break }
default { $value }
}
# test if the key already exists and if not create it
if (!(Test-Path -Path $_.Key -PathType Container)) {
$null = New-Item -Path $_.Key -ItemType RegistryKey -Force
}
Set-ItemProperty -Path $_.Key -Name $_.Property -Value $value -Type $regType -Force
}
这是一个迷人的方法。我认为我将使用的大多数值都应该是简单的字符串值。我稍后会尝试一下,看看效果如何。非常感谢。