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

使用Qwinsta导出精简断开会话列表及PowerShell脚本格式问题求助

Hey there! 我之前也踩过用query session/quser输出处理空格的坑——这类命令的输出是固定宽度格式,直接用Split或Replace修剪空格很容易因为用户名带空格、字段位置偏移等问题抛出异常。给你两个更可靠的解决方案:

方案一:用CIM实例(推荐,结构化数据无格式烦恼)

直接通过PowerShell的CIM接口获取终端服务会话,完全不用处理字符串格式,精准又省心:

# 获取所有已断开连接且关联了用户的远程会话
$disconnectedSessions = Get-CimInstance Win32_TerminalServiceSession | 
    Where-Object { 
        $_.State -eq 'Disconnected' -and 
        $_.UserName -ne $null  # 过滤掉无用户的空会话
    }

# 先输出预览(确认要删除的会话)
Write-Host "`n找到以下断开连接的会话:"
$disconnectedSessions | Select-Object UserName, SessionId | Format-Table -AutoSize

# 批量删除会话(取消注释即可执行)
foreach ($session in $disconnectedSessions) {
    rwinsta $session.SessionId
    Write-Host "已删除会话ID $($session.SessionId),所属用户:$($session.UserName)"
}

这个方法直接拿到结构化的对象,UserName和SessionId都是现成的属性,完全不用纠结空格修剪的问题,兼容性也拉满。

方案二:用正则解析query session输出(兼容老系统)

如果因为环境限制必须用query session命令,可以用正则表达式精准匹配每一行内容,避开空格处理的坑:

# 执行query session并跳过标题行
$sessionLines = query session | Select-Object -Skip 1

foreach ($line in $sessionLines) {
    # 正则适配会话名可选、用户名/会话ID的固定格式
    if ($line -match '^\s*(?:\S+\s+)?(\S+)\s+(\d+)\s+Disconnected') {
        $targetUser = $matches[1]
        $targetSessionId = $matches[2]
        
        Write-Host "待删除会话:用户=$targetUser,ID=$targetSessionId"
        # rwinsta $targetSessionId  # 取消注释执行删除操作
    }
}

原脚本异常的原因

之前用Foreach加Replace修剪空格的思路,本质是把固定宽度字符串当成空格分隔的列表处理,但query session输出存在几个致命问题:

  • 会话名可能为空,导致后续字段位置偏移
  • 用户名如果包含空格(比如"Mary Ann"),Split会直接把用户名拆成两部分
  • 连续空格会让Split产生空元素,进一步引发异常

用正则或者CIM实例的方法就能完美避开这些问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:35:21