我希望从行返回的输出中提取名称值...
Gwmi win32_groupuser –computer $env:computername | ? {$_.groupcomponent –like '*"Administrators"'} | Select -Property PartComponent
我认为我会使用正则表达式进行修剪,但我不熟悉它们的操作,并且(截至目前)一直无法找到足以完成此操作的说明。
作为参考,输出类似于......
\\My_Machine\root\cimv2:Win32_UserAccount.Domain="My_Machine",Name="Administrator"
我想从该输出中提取“管理员”。
现在我正在努力......
$Report = Gwmi win32_groupuser –computer $env:computername | ? {$_.groupcomponent –like '*"Administrators"'} | Select -Property PartComponent
$Report | ForEach-Object {$_.PartComponent -match '(?<=Name=")[^"]+[^"]'
[PSCustomObject]@{Resultant_String=$Matches.Values}}
我正在......
Resultant_String
{Administrator}
True
{admin}
True
{GroupName}
True
{UserName}
True
{CiscoHistRprtUsr}
答案 0 :(得分:1)
尝试这样的事情(?<=Name=")[^"]+[^"]
。这样做是为了Name="
,然后是重复的任何字符(除了"
),然后是任何不是"
的字符。这有点强大,因为如果Name=
不是字符串中的最后一个元素,这仍然有用。如果Name=
表示返回的第一个值,它应该仍然只捕获紧跟在其后面的引号中的内容,而不是其他所有内容,直到最后一个"
。
使用您的测试示例,我做了一些测试here。
答案 1 :(得分:0)
答案 2 :(得分:0)
两种解决方案:
(?<=Name=")[^"]*?(?=")
请注意?
之后的*
在此非常重要。它使量词非贪婪(这只是一种奇特的方式,它表示它将捕获尽可能少的字符,永远不会超过结束"
)。
(?:Name=")([^"]*?)(?:")
由于第一组和最后一组是非捕获的,您只需要检索第二组的值(实际上是捕获方面的第一组和唯一一组),类似\1
或{ {1}}。
答案 3 :(得分:0)
最终我最终得到了这个。
$FileServer = "My_File_Server"
$LocalHostName = $env:computername
$OutPutPath = "\\$FileServer\system_information$\"
$GetAdmins = Gwmi win32_groupuser –computer $LocalHostName | ? {$_.groupcomponent –like '*"Administrators"'} | Select -Property PartComponent
ForEach-Object{$GetAdmins | % {if ($_ -match 'Name="(.+)"') {[PSCustomObject]@{Name=$Matches[1]}}}} | Export-Csv -Path "$OutPutPath\$LocalHostName\$ReportName.csv" -NoTypeInformation}
它生成一个带有名称标题的表,该表具有从返回的字符串中提取的所有本地管理员的用户名。