更新以逗号分隔/分隔的注册表值

时间:2015-01-16 15:14:32

标签: powershell registry

我有一个工作脚本来更新注册表项值,我很想知道是否有更好/更快/更简单/更短的方法来完成它。有什么其他方法可以做到这一点?

$array = @()    
$RegKey = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" | select AppInit_DLLs | % {$_.AppInit_DLLs -split ","}
foreach ($value in $RegKey)
{
    if ($value -notmatch "mfaphook64.dll")
    {
        $array+= $value        
    }
    if ($value -match "mfaphook64.dll")
    {
        $value = "mfaphook64.dll"
        $array+= $value
    }
} 
$array = $array -join ","    
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name AppInit_DLLs -Value $array -Force

之前的价值:

C:\test path\mfaphook64.dll,test.dll

之后的价值:

mfaphook64.dll,test.dll

1 个答案:

答案 0 :(得分:1)

$AppInitdlls = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" | Select-Object -expand AppInit_DLLs 
$AppInitdlls = $AppInitdlls -replace "(.*,)?.+?mfaphook64\.dll(,.*)?",'$1mfaphook64.dll$2'
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" -Name AppInit_DLLs -Value $AppInitdlls -Force

如果您只是想要操作字符串mfaphook64.dll,则不需要将其扩展为数组。一个简单的-replace应该能够处理它。

如果您正在寻找替换当前正在进行的路径可能更容易,但除非有人打败我,否则正则表达式解决方案会更快。

正则表达式细分(.*,)?.+?mfaphook64\.dll(,.*)?

  • (.*,)?如果在dll路径之前有某些内容,则会在此处收集。
  • .+?mfaphook64\.dll会匹配路径。在逗号之后的所有字符直到“dll”字符。
  • (,.*)?如果在dll的路径之后有什么内容,则会在此处收集。
  • 替换包含之前捕获的所有内容(在$1中捕获)和之后(在$2中捕获)并将字符串“mfaphook64.dll”置于其间。

可以在Regex101

找到实例