PowerShell
PowerShell 파이프 라인 작업
수색…
소개
PowerShell은 개체 파이프 라인 모델을 도입하여 전체 개체를 파이프 라인을 통해 소모하는 커맨드 릿 또는 출력물로 보낼 수 있습니다. 클래식 문자열 기반 파이프 라이닝과 달리 파이프 객체의 정보는 특정 위치에 있지 않아도됩니다. 커맨드 릿은 파이프 라인에서 객체와 상호 작용하도록 선언 할 수 있으며 반환 값은 파이프 라인으로 자동 전송됩니다.
통사론
- BEGIN 첫 번째 블록. 시작시 한 번 실행됩니다. 여기에 입력 된 파이프 라인은 설정되지 않았으므로 $ null입니다.
- PROCESS 두 번째 블록. 파이프 라인의 각 요소에 대해 실행됩니다. 파이프 라인 매개 변수는 현재 처리 된 요소와 같습니다.
- END 마지막 블록. 마지막에 한 번 실행됩니다. 파이프 라인 매개 변수는 설정 이후 변경되지 않았으므로 입력의 마지막 요소와 같습니다.
비고
대부분의 경우, 파이프 라인의 입력은 객체 배열입니다. PROCESS{}
블록의 동작이 foreach{}
블록과 비슷하게 보일 수도 있지만 배열의 요소를 건너 뛰는 데는 다른 프로세스가 필요합니다.
foreach{}
에서와 같이 PROCESS{}
블록 내에서 continue
사용하면 END{}
블록을 포함하여 다음 문을 모두 건너 뛰어 파이프 라인을 중단합니다. 대신 return
사용하면 현재 요소에 대한 PROCESS{}
블록 만 끝내고 다음 요소로 이동합니다.
어떤 경우에는 다른 인코딩으로 함수의 결과를 출력 할 필요가 있습니다. CmdLets의 출력 인코딩은 $OutputEncoding
변수로 제어됩니다. 출력을 네이티브 응용 프로그램에 대한 파이프 라인에 넣으려는 경우 대상에 맞게 인코딩을 수정하는 것이 좋습니다. $OutputEncoding = [Console]::OutputEncoding
추가 참조 :
$OutputEncoding
에 대한 자세한 정보가 $OutputEncoding
블로그 기사 https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/
고급 라이프 사이클을 사용하여 함수 작성
이 예제는 함수가 파이프 라인 입력을 받아들이고 효율적으로 반복 할 수있는 방법을 보여줍니다.
함수의 begin
및 end
구조는 파이프 라이닝 할 때 선택 사항이지만 ValueFromPipeline
또는 ValueFromPipelineByPropertyName
사용할 때는 해당 process
가 필요합니다.
function Write-FromPipeline{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
$myInput
)
begin {
Write-Verbose -Message "Beginning Write-FromPipeline"
}
process {
Write-Output -InputObject $myInput
}
end {
Write-Verbose -Message "Ending Write-FromPipeline"
}
}
$foo = 'hello','world',1,2,3
$foo | Write-FromPipeline -Verbose
산출:
VERBOSE: Beginning Write-FromPipeline
hello
world
1
2
3
VERBOSE: Ending Write-FromPipeline
함수의 기본 파이프 라인 지원
이것은 파이프 라이닝에 대한 가장 간단한 지원이 가능한 함수의 예입니다.
파이프 라인을 지원하는 함수에는 ParameterAttribute ValueFromPipeline
또는 ValueFromPipelineByPropertyName
설정된 매개 변수가 적어도 하나 이상 있어야합니다 (아래 그림 참조).
function Write-FromPipeline {
param(
[Parameter(ValueFromPipeline)] # This sets the ParameterAttribute
[String]$Input
)
Write-Host $Input
}
$foo = 'Hello World!'
$foo | Write-FromPipeline
산출:
Hello World!
참고 : PowerShell 3.0 이상에서는 ParameterAttributes의 기본값이 지원됩니다. 이전 버전에서는 ValueFromPipeline=$true
지정해야 ValueFromPipeline=$true
.
파이프 라인의 작업 개념
파이프 라인 시리즈에서 각 함수는 병렬 스레드처럼 다른 스레드와 병렬로 실행됩니다. 첫 번째 처리 된 개체는 다음 파이프 라인으로 전송되고 다음 처리는 다른 스레드에서 즉시 실행됩니다. 이것은 ForEach
표준에 비해 고속 게인을 설명합니다
@( bigFile_1, bigFile_2, ..., bigFile_n) | Copy-File | Encrypt-File | Get-Md5
- step - 첫 번째 파일
Copy-file
(Copy-file
Thread에서) - 단계 - 두 번째 파일
Copy-file
(Copy-file
Thread) 및 동시에 첫 번째 (Encrypt-File
) - (에서 세 번째 파일을 복사 - 단계
Copy-file
(에서 두 번째 파일 암호화를 동시에 실) 및Encrypt-File
동시에) 및get-Md5
(의 첫 번째의Get-Md5
)