REG EXPORT 单个值到 .reg 文件
REG EXPORT single value to .reg file
我想使用 PowerShell 将单个注册表值导出到一个文件(最终编写脚本来备份一堆注册表值)。
我可以使用 QUERY 查看文件:
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse
>>
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
LimitBlankPasswordUse REG_DWORD 0x1
但是,我无法导出单个值。
REQ EXPORT
没有 /v
标志,所以:
REG EXPORT "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" \v "LimitBlankPasswordUse" LBPU.reg
ERROR: Invalid syntax.
无效。
如果我尝试导出我得到的值:
REG EXPORT "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse" LBPU.reg
ERROR: The system was unable to find the specified registry key or value.
如果我只做文件夹:
REG EXPORT "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\" Lsa.reg
The operation completed successfully.
我得到一个 .reg 文件,其中包含正确的 value:key 对 "LimitBlankPasswordUse"=dword:00000001
- 但也包含所有其他对。这是没有用的。我要一对,不要几百个。
如何将单个值导出到 .reg 文件?
您在这里根本没有使用过PowerShell。正如 zett42 所说,这是一个 Get-ItemProperty
问题。如果您 必须 有一个 .reg
文件作为输出,那么您可以轻松创建一个文件,前提是您有像这样的简单情况,其中输出是单个 dword
。如果您有大量项目和更复杂的数据类型,该方法将很困难。
$lsa = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name LimitBlankPasswordUse
$path = $lsa.PSPath.Split('::')
Set-Content foo.reg "Windows Registry Editor Version 5.00`r`n`r`n[$($path[2])]`r`n`"LimitBlankPasswordUse`"=dword:$($lsa.LimitBlankPasswordUse)"
根据您的整体 objective,您可以根据需要硬编码或编写脚本。可能导出为 CSV,然后使用 Set-ItemProperty
.
在目标处应用
没有直接方法可以实现您想要的,并且假设您想要.reg
文件作为输出,使用 PowerShell 的 cmdlet(例如 Get-Item
, Get-ItemProperty
, and Get-ItemPropertyValue
)不是一个选项 - 除非你准备好模拟 .reg
文件格式 在所有方面,这在工作量和复杂性方面都非常重要。[1]
针对您的情况,最好的方法是首先将整个密钥与reg.exe export
导出到临时 文件 和 然后仅提取和导出 header 行和感兴趣的 data-value 对 .
鉴于单个 data-value 对可以 跨越多行 ,这并不简单,但以下内容应该可以很好地工作(您可以将其包装在 function 为了方便和重用):
# Determine the key path and the name of the value to export...
$keyPath = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa'
$valueName = 'LimitBlankPasswordUse'
# ... and the output file path.
$outFile = 'LBPU.reg'
# Create a temporary file and export the whole key to it.
$tempFile = New-TemporaryFile
$null = reg.exe export $keyPath $tempFile /y
# Extract the header lines and the key's *immediate* value children.
# Note: reg.exe export invariably exports *recursively*, so that any
# descendant keys are exported as well, which we want to exclude.
$null = (Get-Content -Raw $tempFile) -match '(?s)^(.+?\])\r\n(.+?)\r\n(?:\r\n|\z)'
Remove-Item $tempFile
# Extract the header lines (format identifier and key path)...
$headerLinesBlock = $Matches[1]
# ... and the key's immediate children as value-data pairs
$valueLinesBlock = $Matches[2]
# Extract the specific value-data pair of interest.
# Note: Such a pair can span *multiple* lines, if "\" is used as the
# line-continuation character at the end of a line, as is common
# with hex. data.
# Continuation lines always start with a *space*, so a data-value pair
# ends either with a new line whose first char. is a non-whitespace char.
# or with the end of the input string.
if ($valueLinesBlock -notmatch "(?sm)^`"$valueName`"=.+?(?=(\r\n\S|\z))") {
throw "Value name not found: $valueName"
}
$valueDataPair = $Matches[0]
# Save the header lines and the data-value pair line(s) to the result file.
# Note that .reg files are "Unicode" (UTF-16LE) files.
$headerLinesBlock, $valueDataPair | Set-Content -Encoding Unicode $outFile
$outFile
收到以下内容:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"LimitBlankPasswordUse"=dword:00000001
[1] 举几个挑战:REG_DWORD
和 REG_QWORD
值必须表示为 hex 值,REG_EXPAND_SZ
值,当使用 Get-ItemProperty
查询时,总是 扩展 ,因此您不会保留存储在注册表中的实际值;此外,REG_EXPAND_SZ
和 REG_MULTI_SZ
值必须分别以十六进制 字节数组 的形式表示为类型 hex(2)
和 hex(7)
。
我想使用 PowerShell 将单个注册表值导出到一个文件(最终编写脚本来备份一堆注册表值)。
我可以使用 QUERY 查看文件:
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse
>>
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
LimitBlankPasswordUse REG_DWORD 0x1
但是,我无法导出单个值。
REQ EXPORT
没有 /v
标志,所以:
REG EXPORT "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" \v "LimitBlankPasswordUse" LBPU.reg
ERROR: Invalid syntax.
无效。
如果我尝试导出我得到的值:
REG EXPORT "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse" LBPU.reg
ERROR: The system was unable to find the specified registry key or value.
如果我只做文件夹:
REG EXPORT "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\" Lsa.reg
The operation completed successfully.
我得到一个 .reg 文件,其中包含正确的 value:key 对 "LimitBlankPasswordUse"=dword:00000001
- 但也包含所有其他对。这是没有用的。我要一对,不要几百个。
如何将单个值导出到 .reg 文件?
您在这里根本没有使用过PowerShell。正如 zett42 所说,这是一个 Get-ItemProperty
问题。如果您 必须 有一个 .reg
文件作为输出,那么您可以轻松创建一个文件,前提是您有像这样的简单情况,其中输出是单个 dword
。如果您有大量项目和更复杂的数据类型,该方法将很困难。
$lsa = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name LimitBlankPasswordUse
$path = $lsa.PSPath.Split('::')
Set-Content foo.reg "Windows Registry Editor Version 5.00`r`n`r`n[$($path[2])]`r`n`"LimitBlankPasswordUse`"=dword:$($lsa.LimitBlankPasswordUse)"
根据您的整体 objective,您可以根据需要硬编码或编写脚本。可能导出为 CSV,然后使用 Set-ItemProperty
.
没有直接方法可以实现您想要的,并且假设您想要.reg
文件作为输出,使用 PowerShell 的 cmdlet(例如 Get-Item
, Get-ItemProperty
, and Get-ItemPropertyValue
)不是一个选项 - 除非你准备好模拟 .reg
文件格式 在所有方面,这在工作量和复杂性方面都非常重要。[1]
针对您的情况,最好的方法是首先将整个密钥与reg.exe export
导出到临时 文件 和 然后仅提取和导出 header 行和感兴趣的 data-value 对 .
鉴于单个 data-value 对可以 跨越多行 ,这并不简单,但以下内容应该可以很好地工作(您可以将其包装在 function 为了方便和重用):
# Determine the key path and the name of the value to export...
$keyPath = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa'
$valueName = 'LimitBlankPasswordUse'
# ... and the output file path.
$outFile = 'LBPU.reg'
# Create a temporary file and export the whole key to it.
$tempFile = New-TemporaryFile
$null = reg.exe export $keyPath $tempFile /y
# Extract the header lines and the key's *immediate* value children.
# Note: reg.exe export invariably exports *recursively*, so that any
# descendant keys are exported as well, which we want to exclude.
$null = (Get-Content -Raw $tempFile) -match '(?s)^(.+?\])\r\n(.+?)\r\n(?:\r\n|\z)'
Remove-Item $tempFile
# Extract the header lines (format identifier and key path)...
$headerLinesBlock = $Matches[1]
# ... and the key's immediate children as value-data pairs
$valueLinesBlock = $Matches[2]
# Extract the specific value-data pair of interest.
# Note: Such a pair can span *multiple* lines, if "\" is used as the
# line-continuation character at the end of a line, as is common
# with hex. data.
# Continuation lines always start with a *space*, so a data-value pair
# ends either with a new line whose first char. is a non-whitespace char.
# or with the end of the input string.
if ($valueLinesBlock -notmatch "(?sm)^`"$valueName`"=.+?(?=(\r\n\S|\z))") {
throw "Value name not found: $valueName"
}
$valueDataPair = $Matches[0]
# Save the header lines and the data-value pair line(s) to the result file.
# Note that .reg files are "Unicode" (UTF-16LE) files.
$headerLinesBlock, $valueDataPair | Set-Content -Encoding Unicode $outFile
$outFile
收到以下内容:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"LimitBlankPasswordUse"=dword:00000001
[1] 举几个挑战:REG_DWORD
和 REG_QWORD
值必须表示为 hex 值,REG_EXPAND_SZ
值,当使用 Get-ItemProperty
查询时,总是 扩展 ,因此您不会保留存储在注册表中的实际值;此外,REG_EXPAND_SZ
和 REG_MULTI_SZ
值必须分别以十六进制 字节数组 的形式表示为类型 hex(2)
和 hex(7)
。