PowerShell:获取两个字符串之间的数据

时间:2016-05-12 16:53:50

标签: powershell

我已将下一个数据转换为变量$ out(类型为Object []):

Success...
Go!
0:#217> trace && .quit
   0x000 Subline         : _OK
   0x008 Timed      : NO
   0x016 Check     : _OK
   0x022 Post       : 
   0x030 Offset         : None
   0x038 Hint     : False
   0x050 NextHint    : False
quit:

我需要在字符串 0:#217>之间提取文本。跟踪&& .quit 退出: 我写道:

[Regex]::Match($out, "(?<=.quit').+?(?=quit:)").Value

但是这会将所需的数据提取到一行(String类型)中,而不是列(Object [])。如何解决这个问题?

P.S。 我自己解决了这个问题如下

([Regex]'(?is)(?:(?<=\.quit).+(?=quit:))').Match(($out -join "`n")).Value

但也许还有更完美的方法可以做到这一点?

4 个答案:

答案 0 :(得分:1)

问题解决了

 DataKeyNames="ID"

 <asp:TemplateField HeaderText="Purpose" SortExpression="Purpose" ItemStyle-Width="50px" HeaderStyle-Width="50px" HeaderStyle-Wrap="false">
                        <ItemTemplate>
                            <asp:Label ID="LabelPurpose" runat="server" Text='<%# Eval("Purpose") %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:DropDownList ID="ddPurpose1" ondatabinding="PreventErrorOnbinding" class="txtSize" SelectedValue='<%# Bind("Purpose") %>' AppendDataBoundItems="true" runat="server">
                            </asp:DropDownList>
                            <asp:RequiredFieldValidator ID="ddPurposeRequiredFieldValidator1" runat="server" Display="Dynamic" ForeColor="Red"
                            ErrorMessage="Select a purpose type." InitialValue="" ControlToValidate="ddPurpose1" ValidationGroup="relationshipGroup2" />                            
                        </EditItemTemplate>

答案 1 :(得分:0)

只需使用-split功能创建结果String[]

$result = ([regex]::Match($a, '\.quit(.*)quit:').Groups[1].value) -split [System.Environment]::NewLine

答案 2 :(得分:0)

[修改:如果$outString[],则可以使用此功能,例如来自$out = Get-Content results.txt,根据您的其他评论,您可能会有不同的内容。

作为一般方法,使用true / false标志选择是否允许行,当您看到第一行然后设置标志,当您看到所需的最后一行时,更改标志。

$middle = foreach ($line in $out) {
    if ($line -match '^quit') { $allow = $false }
    if ($allow) { write-output $line }
    if ($line -match '0:#217>') { $allow = $true }
}

测试的顺序决定了结果中是否显示起始行或结束行。

这可以在控制台上缩短,以便输入:

#   loop  # end line clears flag       # print?     # start line sets flag
$out |% { if($_ -match '^quit'){$f=0}; if ($f){$_}; if ($_ -match '0:#217>'){$f=1} }

答案 3 :(得分:0)

这可能有用,但它做了一些假设:

$out -match '^ '
  1. $ out始终是String []。如果它可能是一个字符串,则强制它@($out)
  2. 您使用的是PowerShell v4或v5,因此-operator将充当数组的过滤器。
  3. 您的示例数据是准确的,您想要的所有行都以空格开头,而其他所有行都没有。