使用PowerShell从文件中获取特定细节

时间:2015-03-15 06:30:54

标签: powershell

我需要从文件中获取特定细节并将其保存到另一个文件中。

这是文件内容:


  

Name : abc

     

CollationName : xxxxxxxxx

     

Edition : System

     

MaxSizeGB : 5

     

MaxSizeBytes : 5368709120

     

ServiceObjectiveName : System

     

ServiceObjectiveAssignmentStateDescription : Complete

     

CreationDate : 02-Jul-14 4:14:19 AM

     

RecoveryPeriodStartDate : 02-Jul-14 4:14:19 AM

     

Name : def

     

CollationName : xxxxxxxxxxxxx

     

Edition : Standard

     

MaxSizeGB : 250

     

MaxSizeBytes : 268435456000

     

ServiceObjectiveName : S2

     

ServiceObjectiveAssignmentStateDescription : Complete

     

CreationDate : 25-Jan-15 6:39:41 PM

     

RecoveryPeriodStartDate : 01-Mar-15 3:00:00 AM

     

Name : ghi

     

CollationName : xxxxxxxx

     

Edition : Standard

     

MaxSizeGB : 250

     

MaxSizeBytes : 268435456000

     

ServiceObjectiveName : S2

     

ServiceObjectiveAssignmentStateDescription : Complete

     

CreationDate : 25-Jan-15 3:19:01 PM

     

RecoveryPeriodStartDate : 01-Mar-15 3:00:00 AM

     

Name : hjiyt

     

CollationName : xxxxxxxxxxxxxxxx

     

Edition : Standard

     

MaxSizeGB : 250

     

MaxSizeBytes : 268435456000

     

ServiceObjectiveName : S2

     

ServiceObjectiveAssignmentStateDescription : Complete

     

CreationDate : 11-Mar-15 11:07:30 AM

     

RecoveryPeriodStartDate : 11-Mar-15 11:37:31 AM


从这个文件中我需要创建一个只包含Name和创建日期的文件。所以输出文件应如下所示:

  

abc 02-Jul-14 4:14:19 AM

     

def 25-Jan-15 6:39:41 PM

     

ghi 25-Jan-15 3:19:01 PM

     

hjiyt 11-Mar-15 11:07:30 AM

如果有人帮助我使用PowerShell做这件事会很棒。

提前致谢

2 个答案:

答案 0 :(得分:1)

假设您至少拥有PowerShell 3.0(对于-Raw的{​​{1}}切换。如果您没有轻松更改可以说明这一点,我们可以将该文本文件转换为PowerShell使数据操作变得容易的对象。

Get-Content

从" C:\ temp \ data.log"获取原始数据;并将文件拆分为行为$fileDataObject = (Get-Content C:\temp\data.log -Raw) -split "\b(?=Name\s+:)" | Select-Object -Skip 1 | ForEach-Object{ New-Object -TypeName PSObject -Property ($_ -replace "\s:\s","=" | ConvertFrom-StringData) } $fileDataObject | ForEach-Object{"{0,-20}{1,-25}" -f $_.Name,$_.CreationDate} | Set-Content "C:\temp\output.txt" 的块。这将返回五个组,第一组是空的,我们跳过第一组。

要求使用Name : text数据对将这些数据块转换为哈希表。然后,我们将白空间之间的所有冒号转换为等号,以满足key=value的需要。此转换被捕获到ConvertFrom-StringData。您可以在下面看到已针对此答案格式化的内容。

$fileDataObject

由于您只想在输出中输入这两列数据,我们可以使用format参数进行排列。我在OP中看到,Name有20个字符间距,因此使用Name CollationName Edition MaxSizeGB MaxSizeBytes ServiceObjectiveName ServiceObjectiveAssignmentStateDescription CreationDate RecoveryPeriodStartDate ---- ------------- ------- --------- ------------ -------------------- ------------------------------------------ ------------ ----------------------- abc xxxxxxxxx System 5 5368709120 System Complete 02-Jul-14 4:14:19 AM 02-Jul-14 4:14:19 AM def xxxxxxxxxxxxx Standard 250 268435456000 S2 Complete 25-Jan-15 6:39:41 PM 01-Mar-15 3:00:00 AM ghi xxxxxxxx Standard 250 268435456000 S2 Complete 25-Jan-15 3:19:01 PM 01-Mar-15 3:00:00 AM hjiyt xxxxxxxxxxxxxxxx Standard 250 268435456000 S2 Complete 11-Mar-15 11:07:30 AM 11-Mar-15 11:37:31 AM 运算符强制输出。

假设" C:\ temp \ output.txt"中没有预先存在的数据;你应该看到你想要的输出。

答案 1 :(得分:0)

$sourcePath = "C:\test.txt"
$targetPath = "C:\output.txt"

$output = New-Object System.Text.StringBuilder

Get-Content $sourcePath | 
    Where-Object { $_.ToString().StartsWith("Name") -or $_.ToString().StartsWith("CreationDate") } | 
    ForEach-Object { 
        $value = $_.ToString().Split(@(':'), 2, [System.StringSplitOptions]::RemoveEmptyEntries)[1].Trim()
        $temp = New-Object System.DateTime
        $isDateTime = [DateTime]::TryParse($value, [ref]$temp)
        if ($isDateTime) {      
            $output.AppendLine("`t`t`t`t`t$value")
        }
        else {
            $output.Append($value)
        }
    }

Set-Content $targetPath $output.ToString().Trim()

您可以根据需要对此进行改进,但是此处显示的示例数据应该可以使用。