我试图在Powershell中获取管道选择字符串命令,只返回我正在搜索的内容,以及最后的一些额外信息。以下是我到目前为止的情况:
PS H:\> gwmi win32_LoggedOnUser -computer server | select-string -pattern "domain" | select-string -pattern "Admin" -NotMatch
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user1\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"44946387\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user2\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"41485153\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user3\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"46401036\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user4\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"40161073\""
\\server\root\cimv2:Win32_LoggedOnUser.Antecedent="\\\\.\\root\\cimv2:Win32_Account.Domain=\"domain\",Name=\"user5\"",Dependent="\\\\.\\root\\cimv2:Win32_LogonSession.LogonId=\"46557830\""
所以我得到了我正在寻找的东西,但我想缩短命令实际显示给我的内容。我希望只看到:
Domain\user1
Domain\user2
但我不知道该怎么做。我最接近的是通过管道另一个命令'选择匹配'到最后。我已经读过正则表达式可能是我的麻烦的答案。
提前感谢您的帮助。
答案 0 :(得分:4)
请使用以下内容:
(gwmi win32_LoggedOnUser) | %{[void]($_.Antecedent -match 'Domain="(\w+)",Name="(\w+)"'); "{0}\{1}" -f $matches[1],$matches[2]}
避免使用这么多select-string
- 就像所有grep,sed,awk,cut voodoo的bash一样,我相信Powershell会避免使用高保真对象。尽量使用对象及其属性。是的,并不总是可以使用它们,我们采用select-string
或其他字符串操作,但尽量避免它们直到最后一步。使Powershell编程整洁,简单且无错误的IMO。
答案 1 :(得分:0)
看看这是否能满足您的需求:
gwmi win32_LoggedOnUser -computer server | select-string -pattern "domain" | select-string -pattern "Admin" -NotMatch | Select-Object @{n='Result'; e={$_ -match '.*Domain=\\"(\w*)\\.*Name=\\"(\w*)\\.*' | Out-Null; $matches[1] + '\' + $matches[2]}}