2015-01-27 2 views
1

저는 powershell에서 워크 플로를 고수하고 있습니다. 이상한 행동을하고 있습니다. 아래 스크립트는 디렉토리에 많은 파일이 없을 때 작동합니다. 어떤 지점이 지나면 6 행 (워크 플로 상태 표시 줄이 나타납니다)에서 메모리를 마운드로 이동 한 다음 (적어도 30 분 후) 충돌합니다. 이 충돌은 파일 디렉토리가 1.25GB 이상일 때 발생하지만 $Path에는 50MB 파일 만있는 경우에는 발생하지 않습니다. 다음은 쉬운 시험입니다 : 이제Powershell 워크 플로 메모리 및 충돌시 괴롭힘

Workflow Test-Me { 
    Param 
    (
     $Path = "c:\temp", 
     $Days = 0 
    ) 
    $Files = InlineScript{ 
       Get-ChildItem -Path $using:Path -File -Recurse -Force | Where-Object {$_.LastWriteTime -lt ((get-date).AddDays(-$using:Days))} 
      } 
    $Files 
} 

이상한 일입니다 Get-ChildItem -Path $using:Path -File -Recurse -Force | Where-Object {$_.LastWriteTime -lt ((get-date).AddDays(-$using:Days))}은 (일반 기능 또는 단지 쉘의 줄에) 워크 플로우의 외부에서 실행되는 심지어 미만 분에 완료 될 때 파일 1.25GB.

메모리를 먹고 오랜 시간이 걸리고 충돌을 일으키는 워크 플로는 무엇입니까? 분명히 예기치 않은 일을하고 있습니다. 다시 말하지만, 디렉토리에 파일이 몇 개 밖에없는 경우에도 작동합니다.

또한 해결책/해결 방법이 유용 할 것입니다.

는 연구 :

Activity to invoke the Microsoft.PowerShell.Management\Get-ChildItem command in a workflow

Running Windows PowerShell Commands in a Workflow

답변

1

문제는 여기에 객체 데이터의 보존과 것으로 보인다. select를 추가하면 반환 된 객체 데이터의 크기가 너무 줄어들어 100GB +를 탐색해도 충돌이 발생하지 않습니다. 해결책은 다음과 같습니다 :

Workflow Test-Me { 
    Param 
    (
     $Path = "c:\temp", 
     $Days = 0 
    ) 
    $Files = InlineScript{ 
       Get-ChildItem -Path $using:Path -File -Recurse -Force | Where-Object {$_.LastWriteTime -lt ((get-date).AddDays(-$using:Days))} | select filename 
      } 
    $Files 
}