有一个包含这么多内容的文本文件:
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。
有没有办法实现这个目标?任何帮助都会非常感激。
答案 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
。