2013-12-10 2 views
0

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

저는 여러분이하는 일에 실제로 두 개의 foreach-object 루프가 필요하다고 생각합니다. -Readcount와 함께 Get-Content를 사용하면 배열 배열을 얻을 수 있습니다. 첫 번째 Foreach-Object에서 -Match를 사용하여 각 배열에서 일치하는 레코드를 필터링합니다. 그것은 일치하는 레코드의 배열을 제공 할 것입니다. 그런 다음 각 레코드에 대해 하나의 개체를 만드는 데 그 배열을 통해 foreach는 할 필요가 : 당신은 정말 누적 바로 출력 PSCustomObjects로 컬렉션을 사용해야하고이 결과 변수에 축적하지 않는

[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 
     } 
    }  
} 

.

+0

이렇게했습니다. 정말 고마워! –