正则表达式删除大部分字符串

时间:2013-10-25 17:05:34

标签: regex powershell-v3.0

我希望从行返回的输出中提取名称值...

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}

4 个答案:

答案 0 :(得分:1)

尝试这样的事情(?<=Name=")[^"]+[^"]。这样做是为了Name=",然后是重复的任何字符(除了"),然后是任何不是"的字符。这有点强大,因为如果Name=不是字符串中的最后一个元素,这仍然有用。如果Name=表示返回的第一个值,它应该仍然只捕获紧跟在其后面的引号中的内容,而不是其他所有内容,直到最后一个"

使用您的测试示例,我做了一些测试here

答案 1 :(得分:0)

如果Name始终位于字符串的末尾,则只需使用

即可
([^"]*)"$

此处的说明:http://regex101.com/r/yV3uD6

答案 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}

它生成一个带有名称标题的表,该表具有从返回的字符串中提取的所有本地管理员的用户名。