Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PowerShell创建注册表项:自定义对象、注册表对象还是单独的语句?_Powershell_Registry - Fatal编程技术网

使用PowerShell创建注册表项:自定义对象、注册表对象还是单独的语句?

使用PowerShell创建注册表项:自定义对象、注册表对象还是单独的语句?,powershell,registry,Powershell,Registry,我正在尝试编写一个PowerShell脚本,该脚本将创建一组注册表项。我一直在谷歌上搜索StackOverflow,以了解其他人是如何完成这项任务的。似乎大多数人都在求助于使用newitem和newitemproperty等等(例如,这个问题) 我对其他编码/脚本语言有了更多的经验,我的想法是创建一个对象集合,然后用一条语句或循环导入所有对象,并分别插入每个对象 伪代码: $keys_to_import = { key1: { property1: value1,

我正在尝试编写一个PowerShell脚本,该脚本将创建一组注册表项。我一直在谷歌上搜索StackOverflow,以了解其他人是如何完成这项任务的。似乎大多数人都在求助于使用
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
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
}

这是一个迷人的方法。我认为我将使用的大多数值都应该是简单的字符串值。我稍后会尝试一下,看看效果如何。非常感谢。