Windows PowerShell拆分字符串提取会话ID返回空,求解决方法
解决quser输出中提取会话ID的问题
你的问题出在split(' ')只会按单个空格拆分字符串,但quser的输出是用多个连续空格分隔字段的,这会导致拆分后生成大量空字符串元素,所以索引[2]对应的是空值。
以下是几种可行的解决方法:
方法1:正则分割(最简便)
使用-split '\s+'匹配一个或多个空白字符(包括空格、制表符),直接得到非空的字段数组:
$id = ((quser /server:'ServerName' | Where-Object { $_ -match 'User' }) -split '\s+')[2]
方法2:正则捕获(更精准)
直接用正则表达式匹配会话ID的数字部分,通过捕获组提取:
$userLine = quser /server:'ServerName' | Where-Object { $_ -match 'User' } if ($userLine -match '\s+(\d+)\s+') { $id = $matches[1] }
这种方法不依赖字段的固定位置,即使输出格式略有变化也能正常提取。
方法3:转换为自定义对象(适合多用户场景)
如果需要处理多个用户的会话信息,可以把输出转换为结构化对象,后续提取字段更灵活:
# 跳过quser的表头行,获取用户数据行 $quserLines = quser /server:'ServerName' | Select-Object -Skip 1 # 转换为自定义对象 $sessionInfo = $quserLines | ForEach-Object { $fields = $_ -split '\s+' [PSCustomObject]@{ Username = $fields[0] SessionName= $fields[1] SessionID = $fields[2] State = $fields[3] IdleTime = $fields[4] LogonTime = $fields[5..6] -join ' ' } } # 提取目标用户的会话ID $id = $sessionInfo | Where-Object Username -eq 'User' | Select-Object -ExpandProperty SessionID
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

