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
相关产品推荐
相关产品推荐

