我已将下一个数据放入变量 $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> trace && .quit 和 quit: 之间的文本 我写道:
[Regex]::Match($out, "(?<=.quit').+?(?=quit:)").Value
但这会将所需数据提取到一行(字符串类型)中,而不是列(Object[])中。如何解决这个问题?
附注 我自己解决了问题如下
([Regex]'(?is)(?:(?<=\.quit).+(?=quit:))').Match(($out -join "`n")).Value
但也许有更完美的方法来做到这一点?
问题解决了
([Regex]'\s+0x([^q]+)').Match(($out -join "`n")).Value
以下是非常简单的搜索,获取起始字符串和结束字符串之间的字符串数据。
代码
Function Get-StringBetweenStartEnd {
Param($Text,$Start,$End)
$Regex = [Regex]::new("(?<="+$Start+")(.*)(?="+$End+")")
$Match = $Regex.Match($String)
if($Match.Success) { Return $Match.Value} else {Return ""}
}
用法示例
$String = "Test: disconnected: 10.10.10.1::59270 (VNC Viewer closed)"
$Result = Get-StringBetweenStartEnd -Text $String -Start "nected:" -End "::"
$Result.Trim()
# Output:
10.10.10.1
只需使用
-split
函数即可创建结果的 String[]
:
$result = ([regex]::Match($a, '\.quit(.*)quit:').Groups[1].value) -split [System.Environment]::NewLine
[编辑:如果
$out
是 String[]
,则这将起作用,例如来自$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} }
这可能有效,但它做了一些假设:
$out -match '^ '
@($out)
强制它。-operator
将充当数组上的过滤器。