我正在尝试解析robocopy日志文件以获取文件大小,路径和日期。我通过正则表达式获取信息没有任何问题。但是,出于某种原因,我得到一个包含单个元素的数组,并且该元素包含3个哈希值。我的术语可能会关闭;我还在学习哈希。我想要的是一个包含多个元素的常规数组。
我得到的输出:
FileSize FilePath DateTime
-------- -------- --------
{23040, 36864, 27136, 24064...} {\\server1\folder\Test File R... {2006/03/15 21:08:01, 2010/12...
如您所见,只有一行,但该行包含多个项目。我想要多行。
这是我的代码:
[regex]$Match_Regex = "^.{13}\s\d{4}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2}\s.*$"
[regex]$Replace_Regex = "^\s*([\d\.]*\s{0,1}\w{0,1})\s(\d{4}\/\d{2}\/\d{2}\s\d{2}:\d{2}:\d{2})\s(.*)$"
$MainContent = New-Object System.Collections.Generic.List[PSCustomObject]
Get-Content $Path\$InFile -ReadCount $Batch | ForEach-Object {
$FileSize = $_ -match $Match_Regex -replace $Replace_Regex,('$1').Trim()
$DateTime = $_ -match $Match_Regex -replace $Replace_Regex,('$2').Trim()
$FilePath = $_ -match $Match_Regex -replace $Replace_Regex,('$3').Trim()
$Props = @{
FileSize = $FileSize;
DateTime = $DateTime;
FilePath = $FilePath
}
$Obj = [PSCustomObject]$Props
$MainContent.Add($Obj)
}
$MainContent | % {
$_
}
我做错了什么?我只是没有得到它。感谢。
注意:这需要尽可能快,因为我必须处理数百万行,这就是我尝试System.Collections.Generic.List的原因。
答案 0 :(得分:1)
我认为问题在于,对于你正在做的事情,你实际上需要两个foreach-object循环。使用带-Readcount的Get-Content将为您提供一组数组。使用第一个Foreach-Object中的-Match过滤掉每个数组中匹配的记录。这将为您提供一系列匹配的记录。然后,您需要通过该数组来为每条记录创建一个对象:
[regex]$Match_Regex = "^.{13}\s\d{4}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2}\s.*$"
[regex]$Replace_Regex = "^\s*([\d\.]*\s{0,1}\w{0,1})\s(\d{4}\/\d{2}\/\d{2}\s\d{2}:\d{2}:\d{2})\s(.*)$"
$MainContent =
Get-Content $Path\$InFile -ReadCount $Batch |
ForEach-Object {
$_ -match $Match_Regex |
ForEach-Object {
$FileSize = $_ -replace $Replace_Regex,('$1').Trim()
$DateTime = $_ -replace $Replace_Regex,('$2').Trim()
$FilePath = $_ -replace $Replace_Regex,('$3').Trim()
[PSCustomObject]@{
FileSize = $FileSize
DateTime = $DateTime
FilePath = $FilePath
}
}
}
你真的不需要将集合用作累加器,只输出PSCustomObjects,让它们在结果变量中累积。