PowerShell中-Match参数未按预期工作,$env:USERNAME被忽略
修复方案
错误点说明
- 使用了中文全角引号
“、”、‘、’,PowerShell 仅识别半角引号'、",直接导致匹配逻辑失效。 - 用单引号包裹
$env:USERNAME,PowerShell 单引号字符串不会解析内部变量,当前写法的逻辑等价于判断固定字符串是否非空,永远返回$true,完全没有实现匹配当前用户名的效果。 - 未将
$env:USERNAME和当前行的用户名做关联匹配,单独写变量不会触发对比逻辑。 quser输出字段索引取值错误,原代码取的字段位置错位,会导致拿到错误的会话ID,logoff执行失败。
修正后代码
$computers = 'computer1','computer2','computer3','computer4' $targetUser = $env:USERNAME foreach ($computer in $computers){ # 过滤断开状态且属于当前用户的会话,2>$null用于屏蔽无会话时的报错 quser /server:$computer 2>$null | Where-Object { $_ -match "Disc" -and $_ -match $targetUser } | ForEach-Object { $splitInfo = $_ -split '\s+' $sessionId = $splitInfo[2] logoff /SERVER:$computer $sessionId } }
优化提示
如果需要避免模糊匹配出错,可以将匹配逻辑替换为严格的字段相等判断:
quser /server:$computer 2>$null | ForEach-Object { $splitInfo = $_ -split '\s+' if ($splitInfo[3] -eq 'Disc' -and $splitInfo[0] -eq $targetUser) { logoff /SERVER:$computer $splitInfo[2] } }
内容的提问来源于stack exchange,提问作者Bonneau21
相关产品推荐
相关产品推荐

