首页 > 解决方案 > 使用 PowerShell 创建注册表项:自定义对象、注册表对象还是单独的语句?

问题描述

我正在尝试编写一个 PowerShell 脚本来创建一堆注册表项。我一直在做一些谷歌搜索以及搜索 StackOverflow 以了解其他人是如何完成这项任务的。似乎大多数人都在诉诸使用New-ItemNew-ItemProperty(例如这个SO问题Creating Registry Keys with Powershell

对其他编码/脚本语言有更多的经验,我的想法是创建一个对象集合,然后用一个语句将它们全部导入或循环它们,分别插入每个对象。

伪代码:

$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
}

是否可以以这种方式批量创建/导入注册表值?

标签: powershellregistry

解决方案


例如,您可以创建一个包含您需要创建的所有键和属性的 CSV 文件。标量属性可以按原样添加,但对于多字符串和二进制值,您必须使用某种方式将它们放入 CSV。

我选择了这些格式:

  • MultiString :使用分隔符分隔不同的字符串,;以便代码可以拆分创建字符串数组
  • 二进制:将所有字节写为十六进制数字作为字符串。例如值A Binary Value变成412042696E6172792056616C7565

CSV 文件如下所示:

"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
}

推荐阅读