过滤 PowerShell 查询输出

过滤 PowerShell 查询输出

我正在寻找一种方法来过滤 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您所指出的那样。

它只是一个字符串。因此,splitsubstringSelect 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

相关内容