我有一个自定义性能计数器类别。Visual Studio Server Explorer 拒绝删除它,声称它“未注册或系统类别”。如果没有以编程方式进行,我该如何删除该类别?有我可以删除的注册表项吗?
4 回答
据我所知,除了以编程方式(它们旨在供应用程序在安装过程中创建和删除)之外,没有其他方法可以安全地删除它们,但从PowerShell命令行控制台执行此操作很简单。只需运行以下命令:
[Diagnostics.PerformanceCounterCategory]::Delete( "Your Category Name" )
但是:(编辑)
您可以删除已创建的注册表项,这将使类别消失。
对于名为“Inventory”的类别,您可以在 ... 处删除整个键,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 资源工具包工具禁用它 - 从安装它
或手动从注册表中禁用它(未尝试过)描述here
http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/94214.mspx?mfr=true