早上好,
我可以使用帮助,我正在尝试使用 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"
所以我得到的结果是:
所以问题是,如何仅替换多字符串键中的某些值,并保留其余值及其顺序?
然后我想创建一个批处理文件,以便我可以在多台电脑上运行它。
非常感谢大家的时间和帮助,谢谢。
您可以使用
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
这可能是 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
只是为了您的 batch-file 标签,这里有一些不使用
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
基本思想是它读取注册表值数据,将其分成列表项,检查每个列表项的密钥对,根据需要进行调整,重建数据,并将其添加回注册表。
请注意,由于这是修改本地计算机密钥,因此需要“以管理员身份运行”/提升权限。
警告:如果有九个或更少的项目,此脚本将仅维护多字符串项目顺序
@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