2017-01-19 1 views
3

다음 명령을 사용하여 파이프 라인을 실행합니다.파이프 라인 의미가 Where-Object로 전파되지 않습니다.

.\Find-CalRatioSamples.ps1 data16 ` 
    | ? {-Not (Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -JobSourceDatasetName $_ -Exists -Location UWTeV-linux)} 

첫번째 사용자 정의 스크립트는 매우 빠르고 (밀리 초) 실행됩니다. 두 번째 명령은 나 역시 작성한 사용자 정의 명령입니다 (https://github.com/LHCAtlas/AtlasSSH/blob/master/PSAtlasDatasetCommands/TestGRIDDataset.cs 참조). 그것은 매우 느립니다.

실제로 입력의 각 줄을 처리하는 속도가 그렇게 느리지는 않습니다. 입력의 첫 번째 줄을 처리 할 수있는 설정은 매우 비쌉니다. 그러나 그것은 매우 빠르게 진행됩니다. 따라서 비싼 코드는 모두 한 번 실행되고 새로운 파이프 라인 입력마다 상당히 빠른 코드 만 실행하면됩니다.

불행히도, 내가 원할 때? {} 위의 구문을 사용하면 PowerShell은 이전처럼 파이프 라인을 유지하지 못하는 것 같습니다. 이제는 각 명령 줄마다 새로운 명령을 내리고 명령이 각 행의 모든 ​​설정을 다시 실행하게합니다.

파이프 라인을 호출하는 방법을 변경할 수 있습니까? 또는이 문제를 방지하기 위해 내 cmdlet을 코딩 한 방법은 무엇입니까? 아니면 이것이 단지 개체가 작동하는 방식이기 때문에 붙어 있습니까?

답변

5

설계대로 작동합니다. 명령을 호출 할 때 scriptblock 안에 새로운 (중첩 된) 파이프 라인을 시작합니다.

함수가 비싼 코드를 Begin 블록에서 처리하는 경우 을 직접 입력하여 함수에 첫 번째 스크립트를 파이프하여 이점을 얻으십시오.

.\Find-CalRatioSamples.ps1 data16 | 
    Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -Exists -Location UWTeV-linux | 
    Where-Object { $_ } 

하지만 그러면 원하는 개체 (원본)가 반환되지 않는 것으로 보입니다.

Test-GRIDDataset을 변경하는 방법 중 하나는 -PassThru 스위치를 구현하는 것입니다. 원래 스크립트의 전체 개체를 실제로 받아들이지는 않으므로 가능한지 여부를 알 수 없습니다. 하지만 당신이 작성한 코드는 이름을 기반으로 어딘가에서 물건 (?)을 가져 오는 것 같습니다. 아마 그게 충분할까요? -PassThru이 지정되면 파이프 라인을 통해 오브젝트를 보내십시오 (존재 여부와 상관없이).

그런 다음 코드는 다음과 같습니다

.\Find-CalRatioSamples.ps1 data16 | 
    Test-GRIDDataset -JobName DiVertAnalysis -JobVersion 13 -Exists -Location UWTeV-linux -PassThru 
+0

나는 PashThru 매개 변수 전에 들어하지 않는 게 좋을 - 한 복 주머니의 비트처럼 보이지만 좋아 보인다. 다음은이 질문에 나중에 나오는 블로그 게시물입니다. https://blogs.technet.microsoft.com/heyscriptingguy/2011/11/18/use-the-powershell-passthru-parameter-and-get -back-objects / – Gordon

관련 문제