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

PowerShell筛选非活跃用户脚本:数组内容错位及显示异常问题

PowerShell筛选非活跃用户:解决数组错位与展示问题

问题根源

query user输出中,当SESSIONNAME为空时,直接按空格拆分字符串会导致字段索引偏移——空值会减少一个分隔符,让后续字段的位置前移,最终造成数组填充错位、展示异常,同时手动构建的$Resultado/$Resultado2因结构不一致也无法正常显示。

修复方案:用正则精准提取字段+对象数组存储

放弃按空格拆分的方式,改用正则表达式匹配每个字段,再将结果存入结构化的对象数组,彻底解决错位问题,同时简化筛选逻辑。

1. 获取会话数据并提取字段

# 获取用户会话,跳过表头行
$userSessions = query user | Select-Object -Skip 1

# 定义正则匹配规则:兼容SESSIONNAME为空的情况
$sessionRegex = '^(?<Username>\S+)\s+(?<SessionName>\S*)\s+(?<Id>\d+)\s+(?<State>\S+)\s+(?<IdleTime>\S+)\s+(?<LogonTime>.+)$'

# 遍历会话,提取为结构化对象
$sessionList = foreach ($line in $userSessions) {
    if ($line -match $sessionRegex) {
        [PSCustomObject]@{
            Username    = $matches.Username
            SessionName = $matches.SessionName
            Id          = $matches.Id
            State       = $matches.State
            IdleTime    = $matches.IdleTime
            LogonTime   = [datetime]$matches.LogonTime
        }
    }
}

2. 筛选非活跃用户

以“闲置时间超过30分钟”或“会话已断开”为非活跃条件为例:

# 设置闲置阈值(30分钟)
$idleThreshold = [timespan]::FromMinutes(30)

# 筛选非活跃用户
$inactiveUsers = $sessionList | Where-Object {
    # 处理IdleTime:'.'表示当前活跃,转换为0时长
    $currentIdle = if ($_.IdleTime -eq '.') { [timespan]::Zero } else { [timespan]$_.IdleTime }
    $currentIdle -ge $idleThreshold -or $_.State -eq 'Disc'
}

3. 正常展示结果

直接输出对象数组即可获得格式化的清晰展示:

$inactiveUsers

为什么这个方案有效

  • 正则表达式通过命名捕获组精准定位每个字段,不受SESSIONNAME空值影响,彻底避免索引错位。
  • 用PSCustomObject存储会话数据,结构统一,PowerShell会自动处理展示格式,无需手动维护$Resultado这类数组。

内容的提问来源于stack exchange,提问作者Iván Montero García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:25:02