我有一个自定义的性能计数器类别。 Visual Studio服务器资源pipe理器拒绝删除它,声称它是“未注册或系统类别”。 通过编程实现它,如何删除类别? 有没有我可以删除的registry项?
据我所知, 没有办法安全地删除它们,除了编程(它们的目的是为了在安装过程中创建和删除应用程序),但是从PowerShell命令行控制台执行操作是微不足道的。 只要运行这个命令:
[Diagnostics.PerformanceCounterCategory]::Delete( "Your Category Name" )
但是:(编辑)
您可以删除创建的注册表项,这将使类别消失。
对于名为“库存”的类别,您可以删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Inventory
的整个密钥…虽然我不愿意打赌清除所有内容 ,但会使该类别消失。 (如果在运行Delete()方法时运行Process Monitor,则可以看到许多其他活动正在发生,而且似乎没有任何其他更改 )。
重要的是要注意, 正如我最初所说 :当你从Visual Studio中得到这个错误时,可能它已经被删除了,你需要刷新VS中的视图。 在我的测试中,我不得不重新启动应用程序,以便让他们实际获得可用类别的清单。
您可以从PowerShell中检查完整的类别列表以查看它是否已列出:
[Diagnostics.PerformanceCounterCategory]::GetCategories() | Format-Table -auto
但是,如果你检查他们,然后删除注册表键……他们仍然会显示,直到你重新启动PowerShell(如果你启动另一个实例,你可以在那里运行相同的查询,它不会显示已删除的项目,但在第一个重新运行GetCategories将继续显示它。
顺便说一下,如果您想使用-like模式,则可以过滤该列表,或者-match用于完整的正则表达式:
[Diagnostics.PerformanceCounterCategory]::GetCategories() | Where {$_.CategoryName -like "*network*" } | Format-Table -auto [Diagnostics.PerformanceCounterCategory]::GetCategories() | Where {$_.CategoryName -match "^SQL.*Stat.*" } | Format-Table -auto
您也可以使用LinqPad,因为这不涉及任何安装 – http://www.linqpad.net/ 。
作为“C#语句”运行以下代码:
System.Diagnostics.PerformanceCounterCategory.Delete("Name of category to delete");
我会运行两次,第一次做实际删除,第二次得到一个错误信息,以确认删除成功。
我知道这个问题,如果老,但我发现了一种非编程方式: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa372130%28v=vs.85%29.aspx
从命令提示符使用unlodctr,您可能还需要使用lodctr / q来查询您的类别。
或者通过修改注册表项(不要删除它)来实现它:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Perflib \ 009 http://msdn.microsoft.com/en-us/library/windows /desktop/aa373172%28v=vs.85%29.aspx
您可以使用Microsoft资源工具包工具禁用它 – 从中进行安装
或者手动禁用注册表(还没有尝试过)
http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/94214.mspx?mfr=true