根据子项名称查找和修改注册表值

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

发现这个 PowerShell 脚本很困难:

我的注册表图片

|
|__SyncRootManager
  |
  |____OneDrive!S-1-5-21-SID
  |          |_____UserSyncRoots
  |
  |____OneDrive!S-1-5-21-SID
             |_____UserSyncRoots

对于作为 OneDrive!S-1-5-21-SID 子项的每个名为“UserSyncRoots”的子项(它们是“HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager”的子项), 它只包含一个名为“S-1-5-21-SID”的注册表值 - 我如何将每个注册表值修改为“C:\AnyOldPath”

我在

Get-ChildItem
循环中使用
foreach
,但我认为我完全走错了路。感谢您提供的任何帮助。

编辑,哎呀,忘了添加我的代码

$registry = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager" -Recurse
Foreach($a in $registry) {
    if ( $a.PSChildName -eq "UserSyncRoots" )
    {
        $subkeys = (Get-ItemProperty $a.pspath)
        #Get-ItemProperty - OK I'm lost here
    }
}
powershell registry
1个回答
0
投票

未经测试(没有这些密钥),但假设没有权限问题,这应该可以工作或接近:

###   Good idea to use single quotes unless string expansion is needed
$keyPath     = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager'
$TargetEnty  = 'S-1-5-21-SID'
$NewValue    = 'C:\AnyOldPath'

Get-ChildItem $keyPath -Recurse |
  where PSChildName -eq 'UserSyncRoots' |
ForEach-Object {
    $splat = @{
        'Path'  = $_.PSPath
        'Name'  = $TargetEnty
        'Value' = $NewValue
        'Type'  = 'String'
    }
    Set-ItemPropertyValue  @splat
}

请注意(根据您的问题)没有对条目是否存在或当前值进行测试 - 如果存在,则其值会更改,如果不存在,则会创建。

  • 注册表值类型
    • 对于字符串和整数 (
      DWORD
      ) 是可选的,但对于其他类型是必需的。
    • 有效值
      • 二进制
      • 展开字符串
      • 多字符串
      • Q字
      • 字符串
      • 未知
© www.soinside.com 2019 - 2024. All rights reserved.