2010-07-06 2 views
1

일부 XML 로그 파일의 요약 데이터를 반환하는 작은 Powershell 함수를 작성하려고합니다. 나는이 같은이 함수를 호출 할 수 있어야한다고 생각Powershell은 루프를 통해 매번 동일한 데이터를 반환합니다.

function Summarize-Log($log) 
{ 
    $obj = New-Object Object 
    $obj | Add-Member NoteProperty Date $log.lastwritetime 
    $obj | Add-Member NoteProperty Passed ([xml](get-content $log)).suite.passed 
    $obj | Add-Member NoteProperty NotImplemented ([xml](get-content $log)).suite.notImplemented 

    return $obj 
} 

: 나는 짧은 요약하는 기능 썼다 나는 다음과 같이 호출하면

dir -recurse $logDirs | where { $_.name -eq "MyLog.xml" } | foreach{ Summarize-Log $_ } 

를, 그것에서 같은 숫자를 읽을 것 각각은 루프를 통과합니다. Date 속성은 정확하지만 get 매개 변수 호출이 입력 매개 변수에 관계없이 동일한 데이터를 반환하는 것처럼 XML에서 읽히는 두 속성은 올바르지 않습니다.

어떻게 수정합니까?

지금은 전체 파일을 두 번 읽는 것처럼 코드에서 나타납니다. 이 정보를 얻는보다 효율적인 방법이 있습니까?

+2

업데이트 된 2.0의 New-Object cmdlet을 사용하는 BTW에서는 Add-Member를 자주 사용하지 않는 경향이 있습니다. '$ props = @ {Date = $ log.LastWriteTime; Passed = ...}; $ obj = new-object psobject -prop $ props'. 그것은 덜 장황하고 IMO와 같이 읽기 쉽습니다. –

+1

속성의 순서를 제어 할 수 있기 때문에 계속해서 Add-Member로 넘어 가고 있습니다. 그것은 너무 나쁘다. -Property는 IEnumerable >을 제공 할 수 없다. – OldFart

+1

대신'dir -recurse $ logDirs | where {$ _. name -eq "MyLog.xml"}''dir -recurse $ logDirs MyLog.xml'을 쓰지 않는 이유는 무엇입니까? 나는 이것이 당신의 문제를 해결할 것이라고 제안하는 것이 아니라 단지 더 간단하다는 것입니다. –

답변

2

스크립트가 정상적으로 보입니다. 명령이 실제로 다른 mylog.xml 파일을 반환하는 dir |

이 함수에 변수에 XML을 캐시, XML을 다시 읽을 수 없습니다하려면

function Summarize-Log($log) 
{ 
    $xml = [xml](get-content $log) 

    $obj = New-Object pscustomobject 
    $obj | Add-Member NoteProperty Date $log.lastwritetime 
    $obj | Add-Member NoteProperty Passed $xml.suite.passed 
    $obj | Add-Member NoteProperty NotImplemented $xml.suite.notImplemented 

    $obj 
} 

는 또한 반환 키워드를 사용하는 습관을 벗어나려고 (난에서 삭제했습니다 내 재 작성) 변수에 할당하여 명시 적으로 캡처되지 않은 값이 함수에서 반환됩니다.

편집 : $_ 대신 $_.fullname을 사용하면 $_.tostring() (의미가 있음)은 경로 + 이름이 아니라 파일 이름만으로 해석됩니다.

dir -rec | foreach { summarize-log $_.fullname } 
+0

나는 확신한다. date 속성이 각 파일에 대해 변경되므로 $ log var이 업데이트되지 않는다고 말하면 미루다. 그러나 Xml에서 읽히는 두 속성은 매번 동일합니다. 그러나 함수를 직접 호출하여 주어진 로그를 전달하면 숫자가 정확합니다. –

+0

그건별로 의미가 없습니다 - 분명히 당신이 보여주는이 스크립트에 더 많은 것이 있습니다. 나머지는 붙여 넣을 수 있습니까? $ logdirs가 그것이 무엇인지 생각해보십시오. 동일한 돈을 여러 번 포함하고 있습니다. – x0n

+0

아니요. 오류가 dir | 어디 섹션; 내가 쓸 경우 dir -recurse foo | 여기서 {$ _. name -eq "Test1.txt"} | foreach {get-content $ _} 트리의 Test1.txt라는 각 파일에 대한 오류와 함께 실패합니다. 그러나 현재 디렉터리에 Test1.txt라는 파일이 있으면 매번 THAT 파일에서 내용을 읽습니다. 아직 해결 방법을 찾고 있습니다. –

관련 문제