PowerShell脚本统计Windows服务器断开会话数始终为0的问题排查
排查PowerShell统计Windows服务器断开会话数的问题
核心问题排查方向
- 未跳过表头行:
query user输出的第一行是标题行(如USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME),若遍历未跳过该行,会导致字段拆分逻辑失效,无法正确识别状态。 - 字段拆分方式错误:输出字段用可变长度空格分隔,直接按固定位置截取或简单拆分会导致字段错位,需用正则匹配任意数量空格来拆分。
- 状态值匹配偏差:部分系统中断开状态可能显示为全称
Disconnected而非缩写Disc,需同时兼容两种情况。
修正后的脚本示例
# 替换为目标服务器名 $SERVER = "YourServerName" $disconnectedCount = 0 # 执行查询并跳过第一行表头 $sessionResults = query user /server:$SERVER | Select-Object -Skip 1 foreach ($sessionLine in $sessionResults) { # 用正则拆分可变空格的字段,过滤空值 $sessionFields = $sessionLine -split '\s+' | Where-Object { $_ } # 状态字段为第4个元素(索引从0开始),可根据实际输出调整 $currentState = $sessionFields[3] # 匹配断开状态的两种可能值 if ($currentState -in 'Disc', 'Disconnected') { $disconnectedCount++ } } Write-Host "断开会话总数:$disconnectedCount"
验证调试步骤
- 单独运行
query user /server:$SERVER,复制输出内容,确认每个会话行的状态字段位置,确保脚本中索引正确。 - 在循环内添加
Write-Host "原始行:$sessionLine"和Write-Host "拆分后字段:$($sessionFields -join ' | ')",查看字段拆分是否正确。 - 检查执行权限:确保运行脚本的账号拥有目标服务器的会话查询权限,否则可能返回不完整结果。
内容的提问来源于stack exchange,提问作者babarsac
相关产品推荐
相关产品推荐

