PowerShell的:两个字符串

问题描述:

我下到的数据变量$ OUT之间获得的数据(类型为对象[]):PowerShell的:两个字符串

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类型)这个提取物,而不是一列(对象[])。如何解决这个问题?

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

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

但也许有做这更完美的方式?

+0

当我运行一个'的String []'正则表达式这些来自'GET-Content',我没有得到任何结果。在String []上使用@jisaak的答案,我确实得到了结果 - 而你没有。你是如何创建'$ out'的? – TessellatingHeckler

问题解决

([Regex]'\s+0x([^q]+)').Match(($out -join "`n")).Value 

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

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

不起作用。我有同样的结果。 – kate

+0

尝试使用'n –

[编辑:这将工作,如果$outString[],例如从$out = Get-Content results.txt,从你的其他评论,你可能会有不同的东西]。

作为一般的方法,有一个真/假的标志,它选择是否允许行通过,当你看到第一行然后设置标志,并且当你看到最后一行时,改变标志。

$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} } 
+0

分割是的,是的......在循环中获取所需的数据是非常糟糕的主意! – kate

+0

...为什么这是一个“非常糟糕的主意”? – TessellatingHeckler

这可能会实现,但它做了一些假设:

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