2011-03-03 3 views
2

5 개의 스크립트를 파이프 라인으로 연결하는 15 개의 스크립트 인스턴스를 실행하고 싶습니다. 지금까지 pixie 먼지가 누락되었습니다. 나는 sub_slave 스크립트를 호출하는 슬레이브 스크립트를 호출하는 마스터 스크립트를 사용하여 문제를 해결했다. (실패를 재연하는 데 파이프 라인이 필요하지 않다.)* .ps1 스크립트가 백그라운드 작업으로 실행되어 * .ps1 스크립트를 실행할 수 있습니까?

master.ps1이 slave.ps1 각 백그라운드 작업은 slave.ps1이 sub_slave.ps1을 호출하는 지점에서 무기한 중단됩니다. slave.ps1에서 sub_slave.ps1로 호출을 주석 처리하면 master.ps1이 완료까지 실행됩니다. 그리고 slave.ps1을 직접 시작하면 sub_slave.ps1에 대한 호출이 정상적으로 실행됩니다. 문제는 다루기 힘든 것 같습니다. 이중 체인을 시도해보십시오. 문서에서 임의의 깊이를 지나서 이러한 스크립트를 데이지 체인으로 연결할 수 없다는 것을 알지 못했지만 어쩌면 충분히 깊이 읽지 않을 수 있습니까?

간단한 텍스트 파일에 추가 콘텐츠로 스크립트를 통해 진행 상황을 추적하고 있습니다.

D : 작업 \ \ master.ps1

$indexes = @(0,1,2) 

$initString = "cd $pwd" 
$initCmd = [scriptblock]::create($initString) 

set-content -path out.txt -value "Master started" 
foreach ($index in $indexes) 
{ 
    add-content -path out.txt -value "job starting" 
    start-job -filepath slave.ps1 -InitializationScript $initCmd -ArgumentList @("master index $index originated") 
} 

add-content -path out.txt -value "master completed" 

D : \ 작업 \ slave.ps1

#requires -version 2.0 

param (
    [parameter(Mandatory=$false)] 
    [string]$message = "slave_originated" 
) 

begin 
{ 
    Set-StrictMode -version Latest 
    add-content -path out.txt -value "slave beginning in $pwd" 
} 

process 
{ 
    add-content -path out.txt -value "slave processing $message" 
    invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 
} 

end 
{ 
    add-content -path out.txt -value "slave ending" 
} 

D : 작업 \ sub_slave.ps1 #requires -version \ 2.0

param (
    [parameter(Mandatory=$false)] 
    [string]$message = "sub_slave originated" 
) 

begin 
{ 
    Set-StrictMode -version Latest 

    add-content -path out.txt -value "sub_slave beginning" 
} 

process 
{ 
    add-content -path out.txt -value "sub_slave processing $message" 
} 

end 
{ 
    add-content -path out.txt -value "sub_slave ending" 
} 

코드를 주석으로 처리하지 않고 작성한 것으로 실행하면 out.txt에 다음과 같이 표시됩니다.,363,210 D : \ 작업 각 작별 메시지 후 바로 다음 명령을 sub_slave.ps1로부터 메시지가 전혀 나타나지 않는 것을 sub_slave.ps1과에 대한 호출입니다 \ out.txt

Master started 
job starting 
job starting 
job starting 
master completed 
slave beginning in D:\jobs 
slave processing master index 0 originated 
slave beginning in D:\jobs 
slave processing master index 1 originated 
slave beginning in D:\jobs 
slave processing master index 2 originated 

참고. 3 개의 powershell.exe 프로세스가 영원히 행복하게 실행되어 시스템이 중단됩니다. Get-job은 3 개의 프로세스가 여전히 실행 중이고 HasMoreData를보고합니다.

내가 가지고있는 유일한 단서가 나는 사고가 정지 된 프로세스를 덤프하는 경우, 내가 볼 것입니다 :

Number of exceptions of this type:  2 
Exception MethodTable: 79330e98 
Exception object: 012610fc 
Exception type: System.Threading.ThreadAbortException 
Message: <none> 
InnerException: <none> 
StackTrace (generated): 
<none> 
StackTraceString: <none> 
HResult: 80131530 
----------------- 

Number of exceptions of this type:  2 
Exception MethodTable: 20868118 
Exception object: 01870344 
Exception type: System.Management.Automation.ParameterBindingException 
Message: System error. 
InnerException: <none> 
StackTrace (generated): 
<none> 
StackTraceString: <none> 
HResult: 80131501 
----------------- 

은 아마도 내가 매개 변수 문제의 어떤 종류가 있어요? sub_slave.ps1에서 모든 매개 변수를 제거하면 동작이 변경되지 않으므로 의심 스럽지만 가능합니다. 나는 어떤 생각이든 열려 있습니다.

답변

3

sub_slave.ps1을 잘못 호출했습니다. 이 :

invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 

이되어야한다

D:\jobs\sub_slave.ps1 -message $message 

메시지를 평가하고 여러 인수되었다지고 있었다.

+0

Grrrr. 고마워, 제이슨. 25 번의 시도를하면서 어딘가에서 invoke-expression을 추가하여 해결책을 닦았습니다. 나는 라인 어딘가에 invoke-expression을 추가했다. 내가 다시 데려 간다면! 테스트 작업을 수정하여 파이프 라이닝을 포함 시켰습니다. 솔루션이 아직 보유하고 있으므로이 답변에 완전히 답변했습니다. 고맙습니다. – codepoke

+1

Invoke-Expression은 항상 나에게 노란 깃발을 가지고 있습니다. 코드를 문자열로 변환 한 다음 다시 평가하는 것을 의미합니다. 인용, 인수 바인딩 등에서 문제를 일으킬 수 있습니다.BTW, 원래 코드가 내게 걸리지 않았으므로 세 작업 모두 Failed로 완료되었지만 동일한 로그 출력이 있습니다. – JasonMArcher

+0

감사. 문제는 내가 코딩 한 서버에서 원격 기능이 꺼져 있다는 것입니다. 내 랩톱에서 코드를 시도하지 않았지만 실제로 mod를 적용한 후에도 제대로 작동했지만 서버에서 여전히 실패했습니다. WinRM이 단서를주었습니다. – codepoke

0

여기에서 추측했지만 여러 스레드/작업을 동일한 파일에 쓰는 것은 out.txt 문제를 일으킬 수 있습니다.