使用搜索字符串读取另一个字符串

时间:2015-08-31 09:42:49

标签: powershell

有一个包含这么多内容的文本文件:

AllocatedStorage           : 5
InstanceName               : snapshotinstance
SnapshotName               : Testsnapshot
SnapshotCreateTime         : 8/26/2015 8:34:47 AM

AllocatedStorage           : 5
InstanceName               : snapshotinstance
SnapshotName               : Backupsnapshot
SnapshotCreateTime         : 7/31/2015 8:00:00 AM

我需要读取一个特定的字符串(从另一个文件读取),如果找到完全匹配,那么我需要检索该块中的另一个字符串。例如,假设我的搜索字符串是“7/31/2015 8:00:00 AM”,那么我需要为该特定块检索SnapshotName。

有没有办法实现这个目标?任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

这样的事情可能是:

$File = Get-Content -Path 'S:\Test\File.txt'
$SearchTerm = '7/31/2015 8:00:00 AM'

$LineNr = $File | Select-String -Pattern $SearchTerm | Select-Object -ExpandProperty LineNumber
$File[$LineNr-2] | Split-String ':' | Select-Object -Last 1

答案 1 :(得分:1)

我正在查看您的数据,它看起来像是ConvertFrom-StringData的合适人选。让我们使用正则表达式将您的日志文件拆分为属性组,并从数据中创建PowerShell对象。

$snapshotData = (Get-Content -Raw "c:\temp\log.log")  -split '\s+(?=AllocatedStorage)' | ForEach-Object {
    # ConvertFrom-StringData needs name=value so we convert the colons.
    $Stringdata = $_-replace '\s+:','='
    New-Object PSObject -Property  $(ConvertFrom-StringData $Stringdata)
}

使用\s+:有助于确保我们不会替换日期字符串中的冒号。现在,您可以搜索数据并返回您要查找的内容。

$snapshotData | Where-Object{$_.SnapshotCreateTime -eq "7/31/2015 8:00:00 AM"} | Select-Object -ExpandProperty SnapshotName

哪会返回:Backupsnapshot。使用自定义对象可以更轻松地快速获取更复杂的数据。

由于我们使用-Raw,您需要使用PowerShell 3.0,但如果需要,可以轻松替换为Out-String