我需要从文件中获取特定细节并将其保存到另一个文件中。
这是文件内容:
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做这件事会很棒。
提前致谢
答案 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()
您可以根据需要对此进行改进,但是此处显示的示例数据应该可以使用。