Windows 10 注册表子项 REG_MULTI_SZ 如何仅编辑部分值

问题描述 投票:0回答:4

早上好,

我可以使用帮助,我正在尝试使用 PowerShell 编辑 REG_MULTI_SZ 的一些值,但我没有任何运气。

关键是:

HKLM\SOFTWARE\Bentley\BentleyDesktopClient\Install

而该键的原始值为:

KeyName_CheckUpdateOption=
KeyName_CheckUpdateOptionModTime=<number-varies>
KeyName_UpdateClientInstallTime=<number-varies>
KeyName_CheckUpdateIsEnabled=1

(根据安装的不同,

KeyName_CheckUpdateOptionModTime=<some-number>
KeyName_UpdateClientInstallTime=<some-number>
的值会有所不同。)

我希望编辑后的最终结果是:

KeyName_CheckUpdateOption=3
KeyName_CheckUpdateOptionModTime=<number-varies>
KeyName_UpdateClientInstallTime=<number-varies>
KeyName_CheckUpdateIsEnabled=0

但我能想到的最好的办法就是使用此脚本仅用一行替换所有数据:

REG ADD HKLM\SOFTWARE\Bentley\BentleyDesktopClient\Install /t REG_MULTI_SZ /v "UpdateClient" /d "Keyname_CheckUpdateOption=3"

所以我得到的结果是:

所以问题是,如何仅替换多字符串键中的某些值,并保留其余值及其顺序?

然后我想创建一个批处理文件,以便我可以在多台电脑上运行它。

非常感谢大家的时间和帮助,谢谢。

powershell batch-file windows-10 registry
4个回答
2
投票

您可以使用

switch
来实现此目的,如下所示:

$regPath  = 'HKLM:\SOFTWARE\Bentley\BentleyDesktopClient\Install'
$oldValue = (Get-ItemPropertyValue -Path $regPath -Name 'UpdateClient') -ne ''
$newValue = switch -Wildcard ($oldValue) {
    'KeyName_CheckUpdateOption=*'    { 'KeyName_CheckUpdateOption=3' }
    'KeyName_CheckUpdateIsEnabled=*' { 'KeyName_CheckUpdateIsEnabled=0' }
    default { $_ }  # return this item unchanged
}
Set-ItemProperty -Path $regPath -Name 'UpdateClient' -Value $newValue

注册表值的新内容将为:

KeyName_CheckUpdateOption=3
KeyName_CheckUpdateOptionModTime=<number-varies>
KeyName_UpdateClientInstallTime=<number-varies>
KeyName_CheckUpdateIsEnabled=0

1
投票

这可能是 powershell 的代码行太多,但它对我有用:

Clear-Host
$currentProperty = (Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Bentley\BentleyDesktopClient\Install | Select-Object -ExpandProperty "UpdateClient")
#You may need this to compare in the future
$newProperty = $currentProperty

#Searching value KeyName_CheckUpdateOption. If value set - replace it, if not - set it
$CurrentKeyName_CheckUpdateOption = $null
$CurrentKeyName_CheckUpdateOption = ($newProperty | Select-String -Pattern 'KeyName_CheckUpdateOption=([0-9.]+)')
if($CurrentKeyName_CheckUpdateOption.Matches.Value) {
    Write-Output $CurrentKeyName_CheckUpdateOption.Matches.Value
    $newProperty = $newProperty.Replace("$($CurrentKeyName_CheckUpdateOption.Matches.Value)","KeyName_CheckUpdateOption=3")
} else {
    $newProperty = $newProperty.Replace("KeyName_CheckUpdateOption=","KeyName_CheckUpdateOption=3")
}

#Same for KeyName_CheckUpdateIsEnabled.
$CurrentKeyName_CheckUpdateIsEnabled = $null
$CurrentKeyName_CheckUpdateIsEnabled = ($newProperty | Select-String -Pattern 'KeyName_CheckUpdateIsEnabled=([0-9.]+)')
if($CurrentKeyName_CheckUpdateIsEnabled.Matches.Value) {
    $newProperty = $newProperty.Replace("$($CurrentKeyName_CheckUpdateIsEnabled.Matches.Value)","KeyName_CheckUpdateIsEnabled=0")
} else {
    $newProperty = $newProperty.Replace("KeyName_CheckUpdateIsEnabled=","KeyName_CheckUpdateIsEnabled=0")
}

# Set updated value to registry
Set-ItemProperty -Path HKLM:\SOFTWARE\Bentley\BentleyDesktopClient\Install -Name UpdateClient -Value $newProperty

0
投票

只是为了您的 标签,这里有一些不使用

powershell.exe
的东西,但仍然使用您使用过的
reg.exe
实用程序。

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "MultiStr="
For /F "EOL=H Tokens=2,*" %%G In ('%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Bentley\BentleyDesktopClient\Install" /V "UpdateClient" 2^>NUL') Do Set "MultiStr=%%H" 
If Not Defined MultiStr GoTo :EOF
For /F "Delims==" %%G In ('"(Set _Item[) 2>NUL"') Do Set "%%G="
Set "i=1"
SetLocal EnableDelayedExpansion
Set "_Item[%i%]=%MultiStr:\0=" & Set /A i += 1 & Set "_Item[!i!]=%"
Set "MultiStr="
If Not Defined _Item[1] (EndLocal & GoTo :EOF)
For /F "Tokens=1-3 Delims==" %%G In ('"(Set _Item[) 2>NUL"') Do If "%%H" == "KeyName_CheckUpdateOption" (If /I Not "%%I" == "3" Set "%%G=%%H=3") Else If "%%H" == "KeyName_CheckUpdateIsEnabled" If /I Not "%%I" == "0" Set "%%G=%%H=0"
For /F "Tokens=1,* Delims==" %%G In ('"(Set _Item[) 2>NUL"') Do If Not Defined MultiStr (Set "MultiStr=%%H") Else Set "MultiStr=!MultiStr!\0%%H"
If Not Defined MultiStr (EndLocal & GoTo :EOF)
%SystemRoot%\System32\reg.exe Add "HKLM\SOFTWARE\Bentley\BentleyDesktopClient\Install" /V "UpdateClient" /T REG_MULTI_SZ /D "!MultiStr!" /F 1>NUL
EndLocal
GoTo :EOF

基本思想是它读取注册表值数据,将其分成列表项,检查每个列表项的密钥对,根据需要进行调整,重建数据,并将其添加回注册表。

请注意,由于这是修改本地计算机密钥,因此需要“以管理员身份运行”/提升权限。

警告:如果有九个或更少的项目,此脚本将仅维护多字符串项目顺序


0
投票

@Theo,谢谢。
我修改了脚本以禁用 Bentley Connection Client 的其他烦人选项。

$regPath  = 'HKLM:\SOFTWARE\Bentley\BentleyDesktopClient\Install'
$oldValue = (Get-ItemPropertyValue -Path $regPath -Name 'UpdateClient') -ne ''
$newValue = switch -Wildcard ($oldValue) {
    'KeyName_CheckUpdateOption=*'    { 'KeyName_CheckUpdateOption=3' }
    'KeyName_CheckUpdateIsEnabled=*' { 'KeyName_CheckUpdateIsEnabled=0' }
    default { $_ }  # return this item unchanged
}
Set-ItemProperty -Path $regPath -Name 'UpdateClient' -Value $newValue

New-ItemProperty -Path $regPath -Name 'AutoLogin' -PropertyType String -Value 'False' -Force
New-ItemProperty -Path $regPath -Name 'OnboardingShown' -PropertyType String -Value 'True' -Force
New-ItemProperty -Path $regPath -Name 'ShowDesktopNotifications' -PropertyType String -Value 'False' -Force

$regPath  = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
Remove-ItemProperty -Path $regPath -Name 'Bentley License Service' -ErrorAction SilentlyContinue
© www.soinside.com 2019 - 2024. All rights reserved.