我如何在PowerShell中两次过滤文本? 我有一个PowerShell脚本,该脚本返回了一个接近我想要的输出,但是有几行和HTML式标签我需要删除。我已经有以下代码要过滤: ...

问题描述 投票:0回答:1
,但是,如果我试图将输出输送到第二个

"select-string"

中,我将不会收回任何结果。我一直在网上查看正则示例,但是我所看到的大部分内容都涉及使用编码循环来实现其目标。我更习惯了Linux Shell,您可以将输出输出到多个
greps
过滤文本。有没有办法与PowerShell实现相同的事情或类似的方法?这是我根据要求使用的文件:

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.force.com/2006/04/metadata">
<actionOverrides>
    <actionName>Accept</actionName>
    <type>Default</type>
</actionOverrides>
<actionOverrides>
    <actionName>CancelEdit</actionName>
    <type>Default</type>
</actionOverrides>
   <actionOverrides>
    <actionName>Today</actionName>
    <type>Default</type>
</actionOverrides>
<actionOverrides>
    <actionName>View</actionName>
    <type>Default</type>
</actionOverrides>
<compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
<enableFeeds>false</enableFeeds>
<fields>
    <fullName>ActivityDate</fullName>
</fields>
<fields>
    <fullName>ActivityDateTime</fullName>
</fields>
<fields>
    <fullName>Guid</fullName>
</fields>
<fields>
    <fullName>Description</fullName>
</fields>
</CustomObject>
,我只想要
<fullName>

描述符之间的文本,到目前为止,我有以下内容:
get-content "txtfile.txt" | select-string -Pattern '<fields>' -Context 1

这将为我提供
<fields>

描述符之间的所有内容,但是我从本质上需要
<fullName>
线,而无需XML标签。

最简单的
PSV3+解决方案是touse powerShell的内置XML DOM支持
,它使XML文档的nodes可以作为对象的

nodes of对象的范围访问,并具有
powershell scripting
1个回答
4
投票

PS> ([xml] (Get-Content -Raw txtfile.txt)).CustomObject.fields.fullName ActivityDate ActivityDateTime Guid Description 注:即使解析XML文档的方法是concenient,但在字符编码方面,它并不完全可靠;请参阅this Answer.

注意,即使

[xml] (Get-Content -Raw ...)

array
-代表顶级元素的所有子元.fields -<fields> -<CustomObject>

直接应用于它并返回了子元素的值

.fullName

所有数组元素
<fullName>元素)作为
array
能够访问
汇总的属性并将其隐式应用于该集合的
的能力,结果被收集在
array
中,是一个通用的psv3+功能,称为Member-access-access enumumeration
作为As Antertantive,请考虑使用

<field>

cmdlet(也可以在psv2中使用),它通常允许使用更复杂的提取逻辑logic(尽管在这里并不严格需要) ; Select-Xml是围绕Select-Xml.NET类型的高级包装器

[xml]
方法。

以下是上述解决方案的等效物: .SelectNodes() 注:

在此片段中反映 - 与点表示法不同 - 使用$namespaces = @{ ns="http://soap.force.com/2006/04/metadata" }
$xpathQuery = '/ns:CustomObject/ns:fields/ns:fullName'
(Select-Xml -LiteralPath txtfile.txt $xpathQuery -Namespace $namespaces).Node.InnerText
时必须考虑xmlnamesp,如下:
civen,所有的后代都处于命名空间Select-Xml
,通过uri
<CustomObject>
确定,您必须:
hashtable中定义此命名空间

您通过

xmlns

参数

caveat

:默认名称空间是特殊的,因为它可以用作Hashtable中的密钥;取而代之的是,选择一个arbitrary关键名称,例如http://soap.force.com/2006/04/metadata

,但请确保将所选的密钥名称用作node-name前缀(请参阅下一点)。
theprefix xpath查询中的所有节点名称带有名称名称,然后是

-Namespace

;例如,
xmlns

    

    MKEment0为问题提供了最佳解决方案。 但是要回答有关使用Select-String两次过滤文本的问题。
  • 如果我们将结果输送到ns,我们可以再次将其传递给:
    。
    这一切都可以在一行上完成,但我使用一个变量来使其更可读。
    
    
    ns:CustomObject
      如果我们用管道
    • Select-StringOut-String -Stream
      ,我们会发现一些有趣的属性。
      
      
      Select-String 这将显示所有实例$Match = Get-Content "atxtfile.txt" | Select-String -Pattern '<fields>' -Context 1 $Match | Out-String -Stream | Select-String -Pattern "Guid" (模式匹配)。
      $match
    • 这将包含
    Get-Member
  • 之前和之后的线(之前和之后的上下文)。
  • 因此,如果您有该文件,则:
    $Match.Matches.Value
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.