powershell - 使用 PowerShell 创建注册表项:自定义对象、注册表对象还是单独的语句?
问题描述
我正在尝试编写一个 PowerShell 脚本来创建一堆注册表项。我一直在做一些谷歌搜索以及搜索 StackOverflow 以了解其他人是如何完成这项任务的。似乎大多数人都在诉诸使用New-Item
等New-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
}
是否可以以这种方式批量创建/导入注册表值?
解决方案
例如,您可以创建一个包含您需要创建的所有键和属性的 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
}
推荐阅读
- regex - perl 根据最近的某些 html 标记内容进行条件替换
- html - 我怎样才能移动整个包含使用绝对定位定位的图像?
- c# - 在 C# 中检查网络连接?
- react-native - 在 react-native 中确定触摸侧
- oracle - 如何查找在 SELECT (Oracle) 中引发错误的记录
- python - 具有回答条件的最大值的 DataFrame 行
- python - Python 合并相似的列表值,从定义的字符数到新的列表值
- android - 片段恢复时 LiveData 不会重新发送
- java - 从 Java 8 中的地图列表中获取字符串
- ansible - 如何从 Ansible 中的所有主机获取变量?