2016-05-12 61 views
2

我下到的數據變量$ 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

回答

1

問題解決

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

只需使用-split功能來創建結果的String[]

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

不起作用。我有同樣的結果。 – kate

+0

嘗試使用'n –

0

[編輯:這將工作,如果$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

0

這可能會實現,但它做了一些假設:

$out -match '^ ' 
  1. $出去始終是一個字符串[]。如果它可能是單個字符串,則強制使用@($out)
  2. 您正在使用PowerShell v4或v5,因此-operator將充當陣列上的過濾器。
  3. 您的示例數據是準確的,您想要的所有行都以空格開頭,而其他所有行都不是。