我正在寻找一种方法来过滤 Windows 10 上 PowerShell 中查询的输出。此命令的输出
query user /server:$SERVER
目前
PS C:\Users\Station> query user /server:$SERVER
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>station console 1 Active none 2/26/2021 10:07 AM
我需要将其过滤为一个字符串,然后将其用作变量,例如
station
请注意,输出没有大于号>
。如果我忽略了这一点,请原谅我,但我已经搜索了太久却毫无收获。看在上帝的份上,请帮帮我。
答案1
继续我的评论,有很多方法可以做到这一点。
RegEx、Substring 等等...正如JG7
您所指出的那样。
它只是一个字符串。因此,split
将substring
Select match|matches
-String 设置为您要查找的字符串索引/模式,然后使用 -replace 删除特殊字符。
本机查询
query user /server:$env:COMPUTERNAME
删除标题
(query user /server:$env:COMPUTERNAME)[1]
选择用户名的固定字段宽度
(((query user /server:$env:COMPUTERNAME)[1]).TrimStart()).SubString(0,21)
前面有一个空格,因此是特殊字符。因此,我们直接删除所有特殊字符。
'>' + (((query user /server:$env:COMPUTERNAME)[1]).TrimStart()).SubString(0,21)
如果有特殊字符,则替换它们
(((query user /server:$env:COMPUTERNAME)[1]).TrimStart()).SubString(0,21) -replace '\W'
# Results
<#
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
postanote rdp-tcp#0 2 Active . 01-Mar-21 20:16
postanote rdp-tcp#0 2 Active . 01-Mar-21 20:16
postanote
>postanote
postanote
#>
你只需要最后那句话。其他的只是作为指导,帮助你找到解决方案。
同样,还有其他方法:
((query user /server:$env:COMPUTERNAME)[1] -split "\s+")[1]
((query user /server:$env:COMPUTERNAME)[1]).SubString(0,22) -replace '\W'
([regex]::Matches((query user /server:$env:COMPUTERNAME)[1],'^\s\w+').Value).TrimStart()
# Results
<#
postanote
postanote
postanote
#>
也可以看看:
https://devblogs.microsoft.com/powershell/parsing-text-with-powershell-1-3