2011-02-14 6 views
0

파일 확장자별로 그룹화하는 필터를 만들려고합니다. 그룹 운영자로, 그것은 쉽게 :Powershell 필터 내에 파이프 라인 연산자를 포함시키는 방법은 무엇입니까?

$fileList | group { [io.path]::getextension($_) } 

내가 타이핑을 절약하기 위해 필터로 위를하고 싶습니다, 그래서 내가 대신이 작업을 수행 할 수 있습니다

$fileList | group-by-extension 

하지만 데 문제가 올바른 구문을 알아 냈어. 이 분명히 예를 들어, 작동하지 않습니다

filter group-by-extension { $_ | group { [io.path]::getextension($_) } } 
function group-by-extension { $_ | group { [io.path]::getextension($_) } } 

어떻게 당신은 다른 필터를 통해 실행 파이프를 받고 반환하는 함수를 작성합니까?

답변

1

필터는 파이프 라인을 통해 제공 각각의 객체에 작용한다. 코드에서 기본적으로 한 번에 하나의 객체를 그룹화합니다. 당신이해야 할 일은 모든 개체를 모아서 그룹화하는 것입니다. BEGIN, PROCESS 및 END 블록과 함께 함수를 사용할 수 있습니다.

function GroupBy-Extension { 
BEGIN {$all = @() } 
PROCESS { $all += $_} 
END {$all | group extension} 
} 
+0

Ah ha! 나는 END가 값을 반환 할 수 있다는 것을 몰랐다. 좋아요, 그래서 그룹 작업과 관련된 제 질문을 해결합니다. 그러나 좀 더 일반적으로 스트리밍 연산자 (그룹이 아닌, 'where')를 사용하고 게으른 평가를 유지하려면 어떻게해야합니까? 이 경우에는 다음 작업으로 넘어 가기 전에 로컬 배열로 버퍼링하고 싶지 않습니다. – scobi

+1

고급 기능, 특히 AcceptValueFromPipeline = $ True 속성을 매개 변수로 사용하는 방법을 살펴볼 수 있습니다. 이것은 아주 좋은 사용자 경험을 만듭니다. 일반적으로 각 객체를 처리하려면 필터를 PRCOESS 블록에 넣습니다. –

+0

감사합니다. 감사합니다. – scobi

1

속성 (이 경우에는 확장자)별로 정렬하거나 파이프를 사용하면 더 좋을지 확실하지 않습니다. 당신이 들어가려고하는 정렬이라는 가정하에, 나는 당신에게 그것을 할 수있는 가장 간단한 방법을 보여주기를 바랍니다.

Get-ChildItem | Sort-Object extension 

는 여기에 대한 링크입니다 :이 달성하기 위해 하나 개 이상의 키워드를 걸리므로 http://technet.microsoft.com/en-us/library/ee176968.aspx

, 그것은 별명 할 수 없습니다. 함수로 작성해야합니다. 나는 두세 개의 편지 명령 이름을 좋아합니다. 유닉스는 그런 것과 타이핑을 더 간단하게 만든다. 어쩌면 함수가 정렬하려는 매개 변수를 취하게하고, 그 매개 변수는 Sort-Object가 취하는 모든 것이어야합니다. 그래서 Get-ChildItem-Sorted에 대해 gcis라고 부릅니다. 구문은 "gcis extension" 일 수 있습니다.

나를 좋아하는 사람이라면 그 하나의 매개 변수를 넣는 것조차별로 좋아하지 않습니다. (나는 커맨드 라인에서 정말로 게으르다). 함수를 gcie (확장명으로 정렬), gcit (시간), gcis (크기) 또는 이와 유사한 것으로 호출하십시오. 이름을 오버로드하여 함수를 빌드하여 호출 한 내용에 따라 다르게 동작 할 수 있습니다. 또는 과부하가 좋지 않은 경우 각각에 대해 별도의 기능을 만들 수 있습니다.

이 정보가 도움이 되었기를 바랍니다.

감사합니다, 로드니 피스크

관련 문제