You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell调用Current Application Pool Uptime性能计数器报错排查

性能计数器路径在C#调用PowerShell时的问题解决

问题场景

在Windows 10系统的PowerShell中直接执行以下命令可以成功获取性能计数器数据:

Get-Counter -Counter '\khubetsov-pc\APP_POOL_WAS(DefaultAppPool)\Current Application Pool Uptime'

但使用.NET Framework 4.8的C#代码调用相同命令时,Invoke()返回空结果,且HadErrors为True,错误提示为The specified counter was not found。

问题1:错误原因分析

确实源于性能计数器路径的指定错误。C#代码中传递的路径使用了双反斜杠\\开头,而PowerShell中本地机器的计数器路径是单反斜杠\开头。双反斜杠会被PowerShell解析为远程机器的计数器路径格式,若未配置远程性能计数器访问权限,或目标机器实际是本地机器,就会导致计数器找不到。

问题2:正确传递路径的规则与方法

核心规则

性能计数器路径的标准格式为:\[机器名]\计数器类别(实例名)\计数器名称

  • 本地机器可省略机器名,或用.代替机器名(推荐,避免机器名解析问题)
  • 路径中的括号、空格等特殊字符是计数器名称的一部分,无需额外转义,只需保证C#传递的是字面量字符串

正确的代码修正方式

方式1:与PowerShell命令完全一致的路径

将C#中的路径参数改为单反斜杠开头(使用@前缀字符串保留字面量):

var commandParameter = new CommandParameter("Counter", @"\khubetsov-pc\APP_POOL_WAS(DefaultAppPool)\Current Application Pool Uptime");

方式2:使用本地机器简写(更可靠)

用.代替本地机器名,避免机器名相关的解析问题:

var commandParameter = new CommandParameter("Counter", @"\.\APP_POOL_WAS(DefaultAppPool)\Current Application Pool Uptime");

方式3:省略本地机器名

若访问本地计数器,可直接省略机器名部分:

var commandParameter = new CommandParameter("Counter", @"\APP_POOL_WAS(DefaultAppPool)\Current Application Pool Uptime");

额外建议

  • 若需访问远程机器的计数器,确保目标机器已开启性能计数器远程访问权限,且路径使用\\机器名\...格式
  • 在C#中传递PowerShell参数时,优先使用@前缀的逐字字符串,避免手动转义反斜杠带来的错误

内容的提问来源于stack exchange,提问作者Anton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:35:24