一个元素包含哈希而不是多个元素 - 如何修复?

时间:2013-12-10 20:28:30

标签: arrays powershell hash robocopy

我正在尝试解析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的原因。

1 个答案:

答案 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,让它们在结果变量中累积。