Powershell 查找并替换注册表值?

Der*_*rek 3 registry powershell

'HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'有一些路径设置为旧服务器。例如:

“我的图片”设置为'\\DeadServer\RedirectedFolders\%UserName%\My Documents\My Pictures'

我想替换"\\DeadServer\RedirectedFolders""C:\Users"

这怎么能在powershell


我尽力了

Get-ItemProperty -path“Microsoft.PowerShell.Core\Registry::HKEY_USERS\*\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell 文件夹”| ?{$_.PSObject.Properties -如“*DeadServer*”}

但我认为我对我想要更改的条目如何是“属性”而不是“项目”感到困惑,并且我不知道如何像项目一样迭代属性。


在您提问之前,我已经通过组策略进行了此更改,但还没有进行。用户正在收到消息

\DeadServer\RedirectedFolders\%UserName%\My Documents\My Pictures` 上的回收站已损坏。您想清空该驱动器的回收站吗?

登录后,文件夹重定向将无法应用。
这是我尝试手动将更改强制返回本地存储。

Der*_*rek 6

我想到了。花了我很长时间,但我写了一个相当不优雅的脚本:

Get-Item -ErrorAction SilentlyContinue -path  "Microsoft.PowerShell.Core\Registry::HKEY_USERS\*\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" |
foreach {
    Get-ItemProperty -Path "Microsoft.PowerShell.Core\Registry::$_" | 
    foreach {
        $CurrentUserShellFoldersPath = $_.PSPath
        $SID = $CurrentUserShellFoldersPath.Split('\')[2]
        $_.PSObject.Properties |
        foreach {
            if ($_.Value -like "*DeadServer*") {
                write-host "Path:`t`t"$CurrentUserShellFoldersPath
                write-host "SID:`t`t"$SID
                write-host "Name:`t`t"$_.Name
                write-host "Old Value:`t"$_.Value
                $newValue = $_.Value
                $newValue = $newValue -replace '\\\\DeadServer\\RedirectedFolders', "C:\Users"
                $newValue = $newValue -replace "My Documents\\", ""
                $newValue = $newValue -replace "My ", ""
                Write-Host "New Value:`t"$newValue
                Set-ItemProperty -Path $CurrentUserShellFoldersPath -Name $_.Name -Value $newValue

                Write-host "================================================================"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你们有的话,我很想了解一种更快或更优雅的方法来做到这一点。