我正在寻找一种从远程打印机删除注册表项/值的方法,这些项/值包括名称“(umgeleitet”,因为它们会使整个RDP-Session变慢。但是我想仅将它们备份在删除不应该的东西
我已经尝试使用Get-ChildItem
和Get-ItemProperty
$Folder = "C:\Users\Public\Documents\Backup"
Reg export HKU "$Folder\Backup.reg"
Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where { $_.Name -match "(umgeleitet *)"}>> "$Folder\Log.log"
Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where { $_.Name -match "(umgeleitet *)"} | Remove-Item -Force -Recurse
上面的代码不会只删除键值。
答案 0 :(得分:1)
导出:
您的问题已经显示了正确的解决方案用法: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
,如您的问题:
C:\Users\Hamza Lachi\AppData\Local\Programs\Python\Python37-32\Scripts
答案 1 :(得分:0)
我重写了一点注册表查询,以匹配PSChildName
属性,该属性较短,并且匹配速度更快。
$matchingRegKeys = Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where PSChildName -match "(umgeleitet *)"
您会注意到,我还将结果放入一个变量中,以便我们可以通过简单的ForEach
循环遍历它们。
ForEach ($regkey in $matchingRegKeys){
"Removing $($regkey.Name)" | Tee-Object -Append "$Folder\Log.log"
$regkey >> "$Folder\Log.log"
Remove-Item -Path $regkey.PSPath
}
Tee-Object
命令告诉PowerShell将输出既写入屏幕,又将附加到指定文件路径中的项目放置到屏幕上。然后我们将regkeys值也写到文件中。
最后,我们调用Remove-Item
并提供$regkey.PSPath
属性,该属性对应于键的完整路径,因此您可以清除键和任何值。
操作中:
Removing HKEY_CURRENT_USER\Software\umgeleitet
Removing HKEY_CURRENT_USER\Software\umgeleitet2
Removing HKEY_CURRENT_USER\Software\umgeleitetTheAwakening
并创建了一个日志文件的片段:
Removing HKEY_CURRENT_USER\Software\umgeleitet
Hive: HKEY_CURRENT_USER\Software
Name Property
---- --------
umgeleitet SomeTestValue : true
完整的代码
$Folder = "C:\Users\Public\Documents\Backup"
Reg export HKU "$Folder\Backup.reg"
$matchingRegKeys = Get-ChildItem -path REGISTRY::HKEY_USERS\ -Recurse | where PSChildName -match "(umgeleitet *)"
ForEach ($regkey in $matchingRegKeys){
"Removing $($regkey.Name)" | Tee-Object -Append "$Folder\Log.log"
$regkey >> "$Folder\Log.log"
Remove-Item -Path $regkey.PSPath
}
答案 2 :(得分:0)
这是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:\key1\key2 name2 myvalue String
HKCU:\key1\key2\key3 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_USER\key1\key2 Property: name2".
What if: Performing the operation "Remove Property" on target "Item: HKEY_CURRENT_USER\key1\key2\key3 Property: name3".