我无法应用许多其他的PowerShell正则表达式解决方案来帮助解决我的问题。答案很可能已经在stackoverflow上了,但是我对PowerShell缺乏经验,这使我无法推断出如何对我的问题提出解决方案。 我有一个文本文件,其中包含一个XML文档树(我将文档树作为一个大字符串引入powershell)(编辑1),其中包含HTML标记以确定某些内容的位置。我需要从文件名标签之间窃取文件名。有时标签和文件名都在一行上,有时标签分别位于单独的行和文件名上。我输入数据的一个例子如下:
<files>
<file>
<fileName>
ThisTextFileINeedReturned.txt
</fileName>
<lastModifiedTime>1511883780000</lastModifiedTime>
<size>852192</size>
<isDirectory>false</isDirectory>
<isRegularFile>true</isRegularFile>
<isSymbolicLink>false</isSymbolicLink>
<isOther>false</isOther>
<group>group</group>
<transferStatus>Done</transferStatus>
</file>
<file>
<fileName>AnotherTextFileINeedReturned.txt</fileName>
<lastModifiedTime>1511883780000</lastModifiedTime>
<size>852192</size>
<isDirectory>false</isDirectory>
<isRegularFile>true</isRegularFile>
<isSymbolicLink>false</isSymbolicLink>
<isOther>false</isOther>
<group>group</group>
<transferStatus>Done</transferStatus>
</file>
到目前为止,我创建了以下代码来查找代码中的内容。如果文件名标签和文件名在同一行,它可以工作。我遇到的问题是在他们都处于单独行的情况下(我在上面提供的示例)。我已经设法将上面的大字符串传输到$ xmldata。
$xmldata -match '<fileName>(.*?)(</fileName>)'
$matches
使用上面显示的示例文本,我收到的输出如下:
<fileName>AnotherTextFileINeedReturned.txt</fileName>
接收标签我很好,但我还需要多行文件的名称。像这样......
<fileName>
ThisTextFileINeedReturned.txt
</fileName>
<fileName>AnotherTextFileINeedReturned.txt</fileName>
或任何会给我两个文本文件名称的变体。我曾经看过以前使用的(?m)部件,但我无法成功实现它。在此先感谢您的帮助!!如果您需要任何其他信息,请与我们联系!
答案 0 :(得分:0)
你应该能够在不使用任何正则表达式的情况下绕过它。 Powershell非常支持XML。提取文件名就像:
$Xml = @"
<files>
<file>
<fileName>
ThisTextFileINeedReturned.txt
</fileName>
<lastModifiedTime>1511883780000</lastModifiedTime>
<size>852192</size>
<isDirectory>false</isDirectory>
<isRegularFile>true</isRegularFile>
<isSymbolicLink>false</isSymbolicLink>
<isOther>false</isOther>
<group>group</group>
<transferStatus>Done</transferStatus>
</file>
<file>
<fileName>AnotherTextFileINeedReturned.txt</fileName>
<lastModifiedTime>1511883780000</lastModifiedTime>
<size>852192</size>
<isDirectory>false</isDirectory>
<isRegularFile>true</isRegularFile>
<isSymbolicLink>false</isSymbolicLink>
<isOther>false</isOther>
<group>group</group>
<transferStatus>Done</transferStatus>
</file>
</files>
"@
Select-Xml -Content $Xml -XPath "//files/file/fileName" | foreach {$_.node.InnerXML.Trim()}
答案 1 :(得分:0)
您没有说明如何获取数据,但我猜您使用Get-Content
来检索源文件。 Get-Content
一次读取一行内容并返回一组对象,每个对象代表一行内容。换句话说,您可能在每条单独的行上都执行了Match
,因此找不到分布在多行上的匹配。
如果确实如此,那么解决方案就是首先简单地加入这些行:
($xmldata -Join "") -match '<fileName>(.*?)(</fileName>)'
检查你的比赛,例如:
$Matches[0]