我正在寻找一种从远程打印机中删除注册表项/值的方法,键/值包括名称"(umgeleitet",因为它们正在减慢整个RDP会话的速度。但是我想备份它们,以防万一删除了不应该删除的内容
我已经尝试过用Get-ChildItem
和Get-ItemProperty
$Folder = "C:UsersPublicDocumentsBackup"
Reg export HKU "$FolderBackup.reg"
Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | where { $_.Name -match "(umgeleitet *)"}>> "$FolderLog.log"
Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | where { $_.Name -match "(umgeleitet *)"} | Remove-Item -Force -Recurse
上面的代码不会删除值,只会删除键。
导出:
您的问题已经显示了正确的解决方案用法:reg.exe export <key-path> <file>
将注册表项的子树导出到文件。
请注意,如果要导出如下所示的特定密钥,则必须为每个密钥调用reg export
以分隔文件,因为reg export
仅支持单个目标密钥路径,并且不支持追加到现有文件。
具体来说,你可以通过管道将以下命令reg export
如下,以创建file1.reg
、file2.reg
、...文件:
$i = 1
Get-ChildItem -path REGISTRY::... | ForEach-Object {
reg.exe export $_.Name "file$(($i++)).reg"
}
通过匹配键的值名称来定位键:
Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | Where-Object {
$_.GetValueNames() -match '(umgeleitet .*)'
}
请注意,需要对-match
使用适当的正则表达式,其中文字(
和)
必须转义,并且
.*
表示任何字符序列。 相比之下,您使用的(umgeleitet *)
是通配符表达式,要与-like
一起使用(但请注意,通配符表达式必须与整个输入字符串匹配(。
如果要与值数据匹配,则需要做更多的工作。
要删除找到的键,只需将上述内容通过管道传输到Remove-Item
,就像您的问题一样:
... | Remove-Item -Force -Recurse
我稍微重写了注册表查询,以匹配PSChildName
属性,该属性更短,匹配速度更快。
$matchingRegKeys = Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | where PSChildName -match "(umgeleitet *)"
您会注意到,我还将结果放入一个变量中,以便我们可以通过简单的ForEach
循环遍历它们。
ForEach ($regkey in $matchingRegKeys){
"Removing $($regkey.Name)" | Tee-Object -Append "$FolderLog.log"
$regkey >> "$FolderLog.log"
Remove-Item -Path $regkey.PSPath
}
Tee-Object
命令告知 PowerShell 将输出写入屏幕,并将追加的项目放入指定的文件路径中。 然后我们将注册表键值也写出到文件中。
最后,我们调用Remove-Item
并提供$regkey.PSPath
属性,该属性对应于键的完整路径,因此您可以清除它以及任何值。
运行中 :
Removing HKEY_CURRENT_USERSoftwareumgeleitet
Removing HKEY_CURRENT_USERSoftwareumgeleitet2
Removing HKEY_CURRENT_USERSoftwareumgeleitetTheAwakening
并创建了日志文件的截图:
Removing HKEY_CURRENT_USERSoftwareumgeleitet
Hive: HKEY_CURRENT_USERSoftware
Name Property
---- --------
umgeleitet SomeTestValue : true
完成的代码
$Folder = "C:UsersPublicDocumentsBackup"
Reg export HKU "$FolderBackup.reg"
$matchingRegKeys = Get-ChildItem -path REGISTRY::HKEY_USERS -Recurse | where PSChildName -match "(umgeleitet *)"
ForEach ($regkey in $matchingRegKeys){
"Removing $($regkey.Name)" | Tee-Object -Append "$FolderLog.log"
$regkey >> "$FolderLog.log"
Remove-Item -Path $regkey.PSPath
}
下面是 get-itemproperty 的替代脚本:
# get-itemproperty2.ps1
# get-childitem skips top level key properties, use get-item for that
# example pipe to set-itemproperty:
# ls -r hkcu:key1 | get-itemproperty2 | where value -match value |
# set-itemproperty -value myvalue -whatif
param([parameter(ValueFromPipeline)]$key)
process {
$valuenames = $key.getvaluenames()
if ($valuenames) {
$valuenames | foreach {
$value = $_
[pscustomobject] @{
Path = $key -replace 'HKEY_CURRENT_USER',
'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
Name = $Value
Value = $Key.GetValue($Value)
Type = $Key.GetValueKind($Value)
}
}
} else {
[pscustomobject] @{
Path = $key -replace 'HKEY_CURRENT_USER',
'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
Name = ''
Value = ''
Type = ''
}
}
}
然后,您可以执行以下操作:
ls -r hkcu:key1 | .get-itemproperty2 | where value -match value
Path Name Value Type
---- ---- ----- ----
HKCU:key1key2 name2 myvalue String
HKCU:key1key2key3 name3 myvalue String
ls -r hkcu:key1 | .get-itemproperty2 | where value -match value | Remove-ItemProperty -WhatIf
What if: Performing the operation "Remove Property" on target "Item: HKEY_CURRENT_USERkey1key2 Property: name2".
What if: Performing the operation "Remove Property" on target "Item: HKEY_CURRENT_USERkey1key2key3 Property: name3".