powershell - 嵌套 FOR 循环以拆分字符串并替换字符串的一部分并删除字符串后的所有内容
powershell - Nested FORLOOPs to split string and replace a portion of the string and Remove everything after string
我有一个 XML 文件,我正在将其转换为 CSV
[xml]$XML = Get-Content .\myconfigs.xml
$xml.Property1.Property2 | Export-CSV myconfigs.csv
以上两行完美导入 XML,解析我不需要的前几层并将其导出到 CSV。
CSV 包含以下 header:
CSV 文件具有:
名称、描述、规则、所有者、window、上次更新
最终我只想拥有名称、描述和规则值,但我需要对 NAME 列进行轻微操作,对 DESCRIPTION 列进行大量操作。 RULE 列的格式非常完美。
要操作 CSV 中包含的数据,我想它可以在 XML 内完成,但我不确定如何,所以我尝试分阶段进行。
首先我需要拆分 NAME 列中的数据,我可以在这里进行。数据是:
“一堆 text.something.XXX.a 一大堆更多文本”,其中 XXX 是目标。我在这里这样做,但是如果我再次尝试将它导出为 CSV,它会出错,因为它说 InputObject 为 null,所以我改为 Set-Content:
Import-Csv "myconfigs.csv" -Header name,description,rule |
% {$_.name.Split('.')[2]} |
Set-Content "name_results.csv"
这就是我 运行 遇到第一个问题的地方。虽然它适当地拆分了 NAME 列中的数据,但它只将该列(没有 header)写入新的 CSV 文件,这使它不再是一个文件,但我认为最坏的情况是我可以只复制每个文件的列并将它们放入电子表格中,另存为 csv。完成了,但我 运行 进入下面的更多挑战。
我需要在 DESCRIPTION 列中进行另一次大规模拆分,所以我返回到 results1.csv 文件并执行以下操作,数据太长,我不想在这里复制,我只想说这确实有效。我从数组中得到了正确的值,但我还是不能 Export-CSV 所以我 Set-Content
Import-Csv "results1.csv" -Header name,description,rule |
% {$_.description.Split('""')[21]} |
Set-Content "desc_results.csv"
现在,我需要进一步操作 DESCRIPTION 字段,因为我导入了一个 CSV 然后 Set-Content,但它没有写 header,但我正在做的是替换单词“五”与“一”字。
Get-Content "descresults.csv" |
% {$_ -replace "Five", "One"} |
Set-Content "oneresults.csv"
这样设置内容的问题在于,由于缺少 header,它用 @{all my results}
包围了我的输出
然后我需要在 DESCRIPTION 列上做另一个替换,进一步复合 @{@{}}
Get-Content "oneresults.csv" |
% {$_ -replace "P2D", "PT3H"} |
Set-Content "PT3Hresults.csv"
我需要在那之后,我需要 trim 此处的结果中字符串“P0D”之后的所有内容应该是 DESCRIPTION 列,但我尝试弄清楚并失败了。我看到了一种很酷的方法,但无法在我的用例中使用它,这种方法称为正向反向查找
$input -replace "(?<=P0D).*"
Set-Content trim.csv
所以现在,(如果我能让它工作的话)我会得到:nameresults.csv 中我的 NAME 列的期望结果,[=90= 中 DESCRIPTION 字段的期望结果](虽然它有@{@{@{allmydata}}},但如果这是我必须清理的最糟糕的情况,那很容易,并且从 RULE 列返回原始 myconfig.csv
我想放弃文件中的所有其他列(所有者,window,上次更新)或者只是不导入它们。
注意:此注释上方的所有内容都与我的试验有关。如果通过 XML 而不是 CSV 进行解析,则提到的分隔符不正确,请参见下文
接受标准:
脚本应从 XML 文件中提取 NAME、DESCRIPTION、RULES 数据并将其导出到 CSV 文件
NAME列中的每一行需要数组[2]中第三位的3个字符代码,以句点(.)分隔,并写入NAME列作为该列中唯一的数据最终输出文件。
DESCRIPTION 列中的每一行都需要数组中的第 28 位[27],double-double quote("") 分隔,从数据中提取,然后将字符串“Five”替换为字符串“One”,字符串“P2D”替换为字符串 PT3H,然后字符串 =P0D trimmed 之后的所有内容从字符串末尾开始写入 DESCRIPTION 列,其中没有前导或尾随字符最终输出文件。
RULE 中的每一行都需要 copied/written 到最终输出文件中的 RULE 列。
我愿意 splitting/replacing 在 XML 级别完成,在导出到 CSV 之前或在导出为 CSV 格式之后,只要结束就可以了满足上述条件的 CSV。 Headers 会很好,但不是必需的。
我已经很接近了,但我无法获取 CSV 文件中的所有列,我一直在获取数据的 @{} appended/prepended 或描述行 trimmed。现在是凌晨 5 点,我真的需要睡觉,所以我希望有人能在我醒来之前帮助我
在此先感谢您的帮助。
嗯。 xml 相当大。我只会分享一个分组,但它会随着我指出的更改进行迭代。由于内容的性质,我不得不检查并用 Lorem Ipsum 文本和乱码替换大部分实际数据。我离开了所有的frmat 和特殊字符相同,并对我所做的所有更改进行了 ReplaceAll,以便它们始终保持一致,因为我们已经深入到 XML(没有 XML 属性) 中的属性这里的实际单词应该无关紧要,除了我需要替换的那些。
此外,由于 Whosebug 不喜欢我尝试在代码块或内联中格式化,我已经分解了我需要的部分,只知道代码块末尾和 [= 开头之间没有空格或特殊字符97=],或者在 URL 的结尾和下一个代码块的开头之间。把它当作一个代码块来对待。在我打破的部分中 FiveMollis 变成了 OneMollis 而 P2D 变成了 PT3H
<Property1>
<Property2>
<name>Lorem ipsum dolor.sit.AAA.amet consectetur adipiscing elit sed do eiusmod tempor</name>
<description>Dona Nobut Patrim <br> A malesuada eget vitae malesuadaVestibulum - MIL Lacus SVELen Ipsum VEL ut turpis-in-eu et cliff.sed wala: <a href="https://w.lobortis.com/index.php/malesuadaing/senectus/auctor/FD12SLJ1">malesuadaVestibulum - MIL Lacus SVELen Ipsum</a><br>cursus aliquam to malesuada 1 malesuadas <br><br><p><table border="1"><tr><td align="center"><b>Lorem</b></td><td align="center"><b>MattisNunc</b></td><td align="center"><b>Menus</b></td><td align="center"><b>2Aq Grenda</b></td><td align="center"><b>24P Grenda</b></td><td align="center"><b>Congue</b></td><td align="center"><b>Semper</b></td></tr><tr><td>aaa</td><td>ALL</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.17f9as1dag71a8av169a1">Tellus</a></td><td><a href="https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td><a href="
https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D
&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D
&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td>p99 > <b>5000.000000 millutecond</b> <br>eget <b>3</b> data points <br>(clear in <b>3</b> data points)</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g"><div id="me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g">Semper...</div></a></td></tr></table><script>onload=changeLink;function changeLink(){contents="";j=0;eget(i=0; i < document.links.length; i++){if(document.links[i].erosNisi == "grendalink"){id = document.links[i].href.split('%2c+')[1];html = document.links[i].innerHTML;document.getElementById(id).innerHTML = html;}}}</script></description>
<alarmRule>AlarmA;</alarmRule>
<owner>OwnerA</owner>
<window>10</window>
<tailWindow>10</tailWindow>
<lastUpdated>2000-01-01T10:00:00+01:00</lastUpdated>
</Property2>
</Property1>
您应该在导出前完成所有操作。像这样:
//这里我有生成xml文档的第一个答案代码,但你只需要将它导出到csv。我的错。
你可以这样做:
如果您想对其进行更多控制并添加一些其他内容(例如检查值等),请使用此代码...
*使用 select-string
的解决方案
[xml]$xml = Get-Content "myConfigs.txt"
$results = @()
foreach ($xmlElement in $xml.Property1.Property2)
{
$results += [PSCustomObject]@{
name = $xmlElement.name.Split(".")[2]
description =description = $xmlElement.description.Substring(($xmlElement.description | Select-String -Pattern "<a href=" -AllMatches).Matches[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"
alarmRule = $xmlElement.alarmRule
}
}
$results | Export-Csv "myCsv.csv" -Encoding UTF8 -NoTypeInformation
这段代码是单行代码,非常简单,但应该可以满足您的所有需求。
[xml]$xml = Get-Content "myConfigs.txt"
$xml.Property1.Property2 | select @{l="name";e={$_.name.Split('.')[2]}}, @{l="description";e={$_.description.Substring(($_.description | Select-String -Pattern "<a href=" -AllMatches).Matches[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"}}, alarmRule | Export-Csv "myCsv.csv" -Encoding UTF8 -NoTypeInformation
*使用 System.Text.RegularExpressions 中的正则表达式 class 的解决方案(我展示它真的没关系,只是因为你问过它在我的代码中的含义)
$results = @()
foreach ($xmlElement in $xml.Property1.Property2)
{
$results += [PSCustomObject]@{
name = $xmlElement.name.Split(".")[2]
description = $xmlElement.description.Substring([Regex]::Matches($xmlElement.description,"<a href=")[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"
alarmRule = $xmlElement.alarmRule
}
}
*Oneliner
[xml]$xml = Get-Content .\myconfigs.xml
$xml.Property1.Property2 | select @{l="name";e={$_.name.Split('.')[2]}}, @{l="description";e={$_.description.Substring([Regex]::Matches($_.description,"<a href=")[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"}}, alarmRule | Export-Csv "myCsv.csv" -Encoding UTF8 -NoTypeInformation
来源:
<Property1>
<Property2>
<name>Lorem ipsum dolor.sit.AAA.amet consectetur adipiscing elit sed do eiusmod tempor</name>
<description>Dona Nobut Patrim <br> A malesuada eget vitae malesuadaVestibulum - MIL Lacus SVELen Ipsum VEL ut turpis-in-eu et cliff.sed wala: <a href="https://w.lobortis.com/index.php/malesuadaing/senectus/auctor/FD12SLJ1">malesuadaVestibulum - MIL Lacus SVELen Ipsum</a><br>cursus aliquam to malesuada 1 malesuadas <br><br><p><table border="1"><tr><td align="center"><b>Lorem</b></td><td align="center"><b>MattisNunc</b></td><td align="center"><b>Menus</b></td><td align="center"><b>2Aq Grenda</b></td><td align="center"><b>24P Grenda</b></td><td align="center"><b>Congue</b></td><td align="center"><b>Semper</b></td></tr><tr><td>aaa</td><td>ALL</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.17f9as1dag71a8av169a1">Tellus</a></td><td><a href="https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td><a href=">https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td>p99 > <b>5000.000000 millutecond</b> <br>eget <b>3</b> data points <br>(clear in <b>3</b> data points)</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g"><div id="me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g">Semper...</div></a></td></tr></table><script>onload=changeLink;function changeLink(){contents="";j=0;eget(i=0; i < document.links.length; i++){if(document.links[i].erosNisi == "grendalink"){id = document.links[i].href.split('%2c+')[1];html = document.links[i].innerHTML;document.getElementById(id).innerHTML = html;}}}</script></description>
<alarmRule>AlarmA;</alarmRule>
<owner>OwnerA</owner>
<window>10</window>
<tailWindow>10</tailWindow>
<lastUpdated>2000-01-01T10:00:00+01:00</lastUpdated>
</Property2>
<Property2>
<name>Lorem ipsum dolor.sit.BBB.amet consectetur adipiscing elit sed do eiusmod tempor</name>
<description>Dona Nobut Patrim <br> A malesuada eget vitae malesuadaVestibulum - MIL Lacus SVELen Ipsum VEL ut turpis-in-eu et cliff.sed wala: <a href="https://w.lobortis.com/index.php/malesuadaing/senectus/auctor/FD12SLJ1">malesuadaVestibulum - MIL Lacus SVELen Ipsum</a><br>cursus aliquam to malesuada 1 malesuadas <br><br><p><table border="1"><tr><td align="center"><b>Lorem</b></td><td align="center"><b>MattisNunc</b></td><td align="center"><b>Menus</b></td><td align="center"><b>2Aq Grenda</b></td><td align="center"><b>24P Grenda</b></td><td align="center"><b>Congue</b></td><td align="center"><b>Semper</b></td></tr><tr><td>aaa</td><td>ALL</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.17f9as1dag71a8av169a1">Tellus</a></td><td><a href="https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td><a href=">https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td>p99 > <b>5000.000000 millutecond</b> <br>eget <b>3</b> data points <br>(clear in <b>3</b> data points)</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g"><div id="me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g">Semper...</div></a></td></tr></table><script>onload=changeLink;function changeLink(){contents="";j=0;eget(i=0; i < document.links.length; i++){if(document.links[i].erosNisi == "grendalink"){id = document.links[i].href.split('%2c+')[1];html = document.links[i].innerHTML;document.getElementById(id).innerHTML = html;}}}</script></description>
<alarmRule>AlarmB;</alarmRule>
<owner>OwnerB</owner>
<window>10</window>
<tailWindow>10</tailWindow>
<lastUpdated>2000-01-01T10:00:00+01:00</lastUpdated>
</Property2>
</Property1>
结果:
"name","description","alarmRule"
"AAA","https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OneMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-PT3H&EndeligTellus1=-P0D","AlarmA;"
"BBB","https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OneMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-PT3H&EndeligTellus1=-P0D","AlarmB;"
To answer your question about Regex class. Powershell is based on .Net framework and you can use all classes from that. You can load every framework assembly and some of them are loaded in default. When you use cmdlet Select-String you are using .Net classes behind that (in Select-String: Regex for example). The Regex Class has some static methods like "Matches" which finds every match in input and return it in MatchCollection (collection based on IList). Absolutely same as Select-String with -AllMatches switch. This method has as input parameters "string input and string pattern " plus it has two overloads, but you can study it later if you want. To the notation of :: it is syntax for accessing static member of class or constructor.
我有一个 XML 文件,我正在将其转换为 CSV
[xml]$XML = Get-Content .\myconfigs.xml
$xml.Property1.Property2 | Export-CSV myconfigs.csv
以上两行完美导入 XML,解析我不需要的前几层并将其导出到 CSV。
CSV 包含以下 header: CSV 文件具有: 名称、描述、规则、所有者、window、上次更新
最终我只想拥有名称、描述和规则值,但我需要对 NAME 列进行轻微操作,对 DESCRIPTION 列进行大量操作。 RULE 列的格式非常完美。
要操作 CSV 中包含的数据,我想它可以在 XML 内完成,但我不确定如何,所以我尝试分阶段进行。
首先我需要拆分 NAME 列中的数据,我可以在这里进行。数据是: “一堆 text.something.XXX.a 一大堆更多文本”,其中 XXX 是目标。我在这里这样做,但是如果我再次尝试将它导出为 CSV,它会出错,因为它说 InputObject 为 null,所以我改为 Set-Content:
Import-Csv "myconfigs.csv" -Header name,description,rule |
% {$_.name.Split('.')[2]} |
Set-Content "name_results.csv"
这就是我 运行 遇到第一个问题的地方。虽然它适当地拆分了 NAME 列中的数据,但它只将该列(没有 header)写入新的 CSV 文件,这使它不再是一个文件,但我认为最坏的情况是我可以只复制每个文件的列并将它们放入电子表格中,另存为 csv。完成了,但我 运行 进入下面的更多挑战。
我需要在 DESCRIPTION 列中进行另一次大规模拆分,所以我返回到 results1.csv 文件并执行以下操作,数据太长,我不想在这里复制,我只想说这确实有效。我从数组中得到了正确的值,但我还是不能 Export-CSV 所以我 Set-Content
Import-Csv "results1.csv" -Header name,description,rule |
% {$_.description.Split('""')[21]} |
Set-Content "desc_results.csv"
现在,我需要进一步操作 DESCRIPTION 字段,因为我导入了一个 CSV 然后 Set-Content,但它没有写 header,但我正在做的是替换单词“五”与“一”字。
Get-Content "descresults.csv" |
% {$_ -replace "Five", "One"} |
Set-Content "oneresults.csv"
这样设置内容的问题在于,由于缺少 header,它用 @{all my results}
包围了我的输出然后我需要在 DESCRIPTION 列上做另一个替换,进一步复合 @{@{}}
Get-Content "oneresults.csv" |
% {$_ -replace "P2D", "PT3H"} |
Set-Content "PT3Hresults.csv"
我需要在那之后,我需要 trim 此处的结果中字符串“P0D”之后的所有内容应该是 DESCRIPTION 列,但我尝试弄清楚并失败了。我看到了一种很酷的方法,但无法在我的用例中使用它,这种方法称为正向反向查找
$input -replace "(?<=P0D).*"
Set-Content trim.csv
所以现在,(如果我能让它工作的话)我会得到:nameresults.csv 中我的 NAME 列的期望结果,[=90= 中 DESCRIPTION 字段的期望结果](虽然它有@{@{@{allmydata}}},但如果这是我必须清理的最糟糕的情况,那很容易,并且从 RULE 列返回原始 myconfig.csv
我想放弃文件中的所有其他列(所有者,window,上次更新)或者只是不导入它们。
注意:此注释上方的所有内容都与我的试验有关。如果通过 XML 而不是 CSV 进行解析,则提到的分隔符不正确,请参见下文
接受标准: 脚本应从 XML 文件中提取 NAME、DESCRIPTION、RULES 数据并将其导出到 CSV 文件
NAME列中的每一行需要数组[2]中第三位的3个字符代码,以句点(.)分隔,并写入NAME列作为该列中唯一的数据最终输出文件。
DESCRIPTION 列中的每一行都需要数组中的第 28 位[27],double-double quote("") 分隔,从数据中提取,然后将字符串“Five”替换为字符串“One”,字符串“P2D”替换为字符串 PT3H,然后字符串 =P0D trimmed 之后的所有内容从字符串末尾开始写入 DESCRIPTION 列,其中没有前导或尾随字符最终输出文件。
RULE 中的每一行都需要 copied/written 到最终输出文件中的 RULE 列。
我愿意 splitting/replacing 在 XML 级别完成,在导出到 CSV 之前或在导出为 CSV 格式之后,只要结束就可以了满足上述条件的 CSV。 Headers 会很好,但不是必需的。
我已经很接近了,但我无法获取 CSV 文件中的所有列,我一直在获取数据的 @{} appended/prepended 或描述行 trimmed。现在是凌晨 5 点,我真的需要睡觉,所以我希望有人能在我醒来之前帮助我
在此先感谢您的帮助。
嗯。 xml 相当大。我只会分享一个分组,但它会随着我指出的更改进行迭代。由于内容的性质,我不得不检查并用 Lorem Ipsum 文本和乱码替换大部分实际数据。我离开了所有的frmat 和特殊字符相同,并对我所做的所有更改进行了 ReplaceAll,以便它们始终保持一致,因为我们已经深入到 XML(没有 XML 属性) 中的属性这里的实际单词应该无关紧要,除了我需要替换的那些。
此外,由于 Whosebug 不喜欢我尝试在代码块或内联中格式化,我已经分解了我需要的部分,只知道代码块末尾和 [= 开头之间没有空格或特殊字符97=],或者在 URL 的结尾和下一个代码块的开头之间。把它当作一个代码块来对待。在我打破的部分中 FiveMollis 变成了 OneMollis 而 P2D 变成了 PT3H
<Property1>
<Property2>
<name>Lorem ipsum dolor.sit.AAA.amet consectetur adipiscing elit sed do eiusmod tempor</name>
<description>Dona Nobut Patrim <br> A malesuada eget vitae malesuadaVestibulum - MIL Lacus SVELen Ipsum VEL ut turpis-in-eu et cliff.sed wala: <a href="https://w.lobortis.com/index.php/malesuadaing/senectus/auctor/FD12SLJ1">malesuadaVestibulum - MIL Lacus SVELen Ipsum</a><br>cursus aliquam to malesuada 1 malesuadas <br><br><p><table border="1"><tr><td align="center"><b>Lorem</b></td><td align="center"><b>MattisNunc</b></td><td align="center"><b>Menus</b></td><td align="center"><b>2Aq Grenda</b></td><td align="center"><b>24P Grenda</b></td><td align="center"><b>Congue</b></td><td align="center"><b>Semper</b></td></tr><tr><td>aaa</td><td>ALL</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.17f9as1dag71a8av169a1">Tellus</a></td><td><a href="https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td><a href="
https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D
&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D
&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td>p99 > <b>5000.000000 millutecond</b> <br>eget <b>3</b> data points <br>(clear in <b>3</b> data points)</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g"><div id="me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g">Semper...</div></a></td></tr></table><script>onload=changeLink;function changeLink(){contents="";j=0;eget(i=0; i < document.links.length; i++){if(document.links[i].erosNisi == "grendalink"){id = document.links[i].href.split('%2c+')[1];html = document.links[i].innerHTML;document.getElementById(id).innerHTML = html;}}}</script></description>
<alarmRule>AlarmA;</alarmRule>
<owner>OwnerA</owner>
<window>10</window>
<tailWindow>10</tailWindow>
<lastUpdated>2000-01-01T10:00:00+01:00</lastUpdated>
</Property2>
</Property1>
您应该在导出前完成所有操作。像这样:
//这里我有生成xml文档的第一个答案代码,但你只需要将它导出到csv。我的错。
你可以这样做:
如果您想对其进行更多控制并添加一些其他内容(例如检查值等),请使用此代码...
*使用 select-string
的解决方案[xml]$xml = Get-Content "myConfigs.txt"
$results = @()
foreach ($xmlElement in $xml.Property1.Property2)
{
$results += [PSCustomObject]@{
name = $xmlElement.name.Split(".")[2]
description =description = $xmlElement.description.Substring(($xmlElement.description | Select-String -Pattern "<a href=" -AllMatches).Matches[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"
alarmRule = $xmlElement.alarmRule
}
}
$results | Export-Csv "myCsv.csv" -Encoding UTF8 -NoTypeInformation
这段代码是单行代码,非常简单,但应该可以满足您的所有需求。
[xml]$xml = Get-Content "myConfigs.txt"
$xml.Property1.Property2 | select @{l="name";e={$_.name.Split('.')[2]}}, @{l="description";e={$_.description.Substring(($_.description | Select-String -Pattern "<a href=" -AllMatches).Matches[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"}}, alarmRule | Export-Csv "myCsv.csv" -Encoding UTF8 -NoTypeInformation
*使用 System.Text.RegularExpressions 中的正则表达式 class 的解决方案(我展示它真的没关系,只是因为你问过它在我的代码中的含义)
$results = @()
foreach ($xmlElement in $xml.Property1.Property2)
{
$results += [PSCustomObject]@{
name = $xmlElement.name.Split(".")[2]
description = $xmlElement.description.Substring([Regex]::Matches($xmlElement.description,"<a href=")[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"
alarmRule = $xmlElement.alarmRule
}
}
*Oneliner
[xml]$xml = Get-Content .\myconfigs.xml
$xml.Property1.Property2 | select @{l="name";e={$_.name.Split('.')[2]}}, @{l="description";e={$_.description.Substring([Regex]::Matches($_.description,"<a href=")[3].Index + '<a href=">'.Length) -replace "Five","One" -replace "P2D","PT3H" -replace "(?<=P0D).*"}}, alarmRule | Export-Csv "myCsv.csv" -Encoding UTF8 -NoTypeInformation
来源:
<Property1>
<Property2>
<name>Lorem ipsum dolor.sit.AAA.amet consectetur adipiscing elit sed do eiusmod tempor</name>
<description>Dona Nobut Patrim <br> A malesuada eget vitae malesuadaVestibulum - MIL Lacus SVELen Ipsum VEL ut turpis-in-eu et cliff.sed wala: <a href="https://w.lobortis.com/index.php/malesuadaing/senectus/auctor/FD12SLJ1">malesuadaVestibulum - MIL Lacus SVELen Ipsum</a><br>cursus aliquam to malesuada 1 malesuadas <br><br><p><table border="1"><tr><td align="center"><b>Lorem</b></td><td align="center"><b>MattisNunc</b></td><td align="center"><b>Menus</b></td><td align="center"><b>2Aq Grenda</b></td><td align="center"><b>24P Grenda</b></td><td align="center"><b>Congue</b></td><td align="center"><b>Semper</b></td></tr><tr><td>aaa</td><td>ALL</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.17f9as1dag71a8av169a1">Tellus</a></td><td><a href="https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td><a href=">https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td>p99 > <b>5000.000000 millutecond</b> <br>eget <b>3</b> data points <br>(clear in <b>3</b> data points)</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g"><div id="me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g">Semper...</div></a></td></tr></table><script>onload=changeLink;function changeLink(){contents="";j=0;eget(i=0; i < document.links.length; i++){if(document.links[i].erosNisi == "grendalink"){id = document.links[i].href.split('%2c+')[1];html = document.links[i].innerHTML;document.getElementById(id).innerHTML = html;}}}</script></description>
<alarmRule>AlarmA;</alarmRule>
<owner>OwnerA</owner>
<window>10</window>
<tailWindow>10</tailWindow>
<lastUpdated>2000-01-01T10:00:00+01:00</lastUpdated>
</Property2>
<Property2>
<name>Lorem ipsum dolor.sit.BBB.amet consectetur adipiscing elit sed do eiusmod tempor</name>
<description>Dona Nobut Patrim <br> A malesuada eget vitae malesuadaVestibulum - MIL Lacus SVELen Ipsum VEL ut turpis-in-eu et cliff.sed wala: <a href="https://w.lobortis.com/index.php/malesuadaing/senectus/auctor/FD12SLJ1">malesuadaVestibulum - MIL Lacus SVELen Ipsum</a><br>cursus aliquam to malesuada 1 malesuadas <br><br><p><table border="1"><tr><td align="center"><b>Lorem</b></td><td align="center"><b>MattisNunc</b></td><td align="center"><b>Menus</b></td><td align="center"><b>2Aq Grenda</b></td><td align="center"><b>24P Grenda</b></td><td align="center"><b>Congue</b></td><td align="center"><b>Semper</b></td></tr><tr><td>aaa</td><td>ALL</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.17f9as1dag71a8av169a1">Tellus</a></td><td><a href="https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OnteHongo&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P14D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td><a href=">https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&search=suscipitnisi%3DScelerisque%20dontateteste%3D%24Porta%24%20consumenumem%3D%24aaa%24%20maestroguildido%3D%24ALL%24%20masetro%3D%24ALL%24%20scelerisquenisi%3D%24malesuadaVestibulum%24%20MattisNunc%3D%24ALL%24%20consueno%3D%24ALL%24%20Menuseros%3D%24NONE%24%20insisante%3D%24NONE%24%20Menus%3D%24Tellus%24"><img src="https://malesuadapulvinar.lobortis.com/MIL?Acliqua=GetGrenda&Vitae=2000-01-01&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=FiveMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-P2D&EndeligTellus1=-P0D&HendreritLiberoLanto1=5000.0&HinestIdPriste=100&WondeIdPriste=150&DecagearPontas=false&ApeararExsislano=false&ApeararXAxutContedido=false" alt="iGrenda"/></a></td><td>p99 > <b>5000.000000 millutecond</b> <br>eget <b>3</b> data points <br>(clear in <b>3</b> data points)</td><td><a href="https://malesuadapulvinar.lobortis.com/malesuadas/onsonjo?&id=me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g"><div id="me-sorto-1:malesuadaing.MIL.AAA.Aliquam.malesuadaVestibulum.malesuadaVestibulum - MIL Lacus SVELen Ipsum.amet.PharetraAaBbAaBbAaBbBbAaAaBb.8f94sa9d6846a81sds46d8sf146a83a68sda4g">Semper...</div></a></td></tr></table><script>onload=changeLink;function changeLink(){contents="";j=0;eget(i=0; i < document.links.length; i++){if(document.links[i].erosNisi == "grendalink"){id = document.links[i].href.split('%2c+')[1];html = document.links[i].innerHTML;document.getElementById(id).innerHTML = html;}}}</script></description>
<alarmRule>AlarmB;</alarmRule>
<owner>OwnerB</owner>
<window>10</window>
<tailWindow>10</tailWindow>
<lastUpdated>2000-01-01T10:00:00+01:00</lastUpdated>
</Property2>
</Property1>
结果:
"name","description","alarmRule"
"AAA","https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OneMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-PT3H&EndeligTellus1=-P0D","AlarmA;"
"BBB","https://malesuadapulvinar.lobortis.com/igrenda?&SuscipitNisi1=Scelerisque&DranarSit1=Porta&Mullendisto1=aaa&HabitantGrunpa1=ALL&Habitant1=ALL&ScelerisqueNisi1=malesuadaVestibulum&MattisNunc1=ALL&Cursus1=ALL&MenusCloues1=NONE&Inhedishet1=NONE&Menus1=Tellus&Pursius=OneMollis&Tats1=p99&ViverraUrna1=millutecond&UltriciesLarbano1=ALL&BeignTellus1=-PT3H&EndeligTellus1=-P0D","AlarmB;"
To answer your question about Regex class. Powershell is based on .Net framework and you can use all classes from that. You can load every framework assembly and some of them are loaded in default. When you use cmdlet Select-String you are using .Net classes behind that (in Select-String: Regex for example). The Regex Class has some static methods like "Matches" which finds every match in input and return it in MatchCollection (collection based on IList). Absolutely same as Select-String with -AllMatches switch. This method has as input parameters "string input and string pattern " plus it has two overloads, but you can study it later if you want. To the notation of :: it is syntax for accessing static member of class or constructor.