我有一个工作脚本来更新注册表项值,我很想知道是否有更好/更快/更简单/更短的方法来完成它。有什么其他方法可以做到这一点?
$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
答案 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
找到实例