Articles

ForEach 및 마법 방법

ForEach 어디가 두 자주 사용하는 개념에서 이용 가능 PowerShell 이후 버전 1 은 2006 년에 나왔. ForEach 되었으로 사용할 수 있 성명 및 cmdlet(ForEach-체)할 수 있도록 컬렉션을 반복하는 개체의 몇 가지 동작을 완료한 각 개체의 모음입니다. 어디에 사용할 수 있으로 cmdlet(Where-체)할 수 있도록,항목을 필터에서 컬렉션을 통과하지 않는 일부 조건는 상태를 평가할 수 있습 중 하나를 사용하여 속성에 대한 개체를 수집하거나 객체를 스스로 컬렉션에 속하는. ForEach 행동을 취하는 능력 항목에 대한 컬렉션에서 어디를 필터링 할 수있는 컬렉션은 특징은 매우 유용하고 있에 포함된 하나 또는 다른 형태의 논리에 많은 뒤에 PowerShell,명령어와 모듈,버전에 관계없이 PowerShell 사용하고 있습니다. 사실,그들은 너무 심하게 사용되었다는 포커스 지역의 개선을 위한 성능,기능 및 구문에 PowerShell 버전 3.0 4.0.

윈도우의 출시와 함께 PowerShell4.0,두 개의 새로운”magic”방법을 소개한 컬렉션의 유형을 제공하는 새로운 액세스하기 위한 구문 ForEach 어디서 기능해졌습니다. 이러한 메소드는 ForEach 와 Where 로 적절하게 명명됩니다. 나는 그들이 PowerShell 에서 작동하는 방식에있어 매우 마술 적이기 때문에 이러한 방법을”마법”이라고 부릅니다. -Force 및 request-MemberType 을 모두 적용하더라도 Get-Member 출력에 표시되지 않습니다. 는 경우에 당신은 소매를 발굴에 반사와 함께,당신은 그들을 찾을 수 있습니다;그러나,그것은 필요한 광범위한 검색기 때문에 그들은 개인 확장을 구현하는 방법을에 전용 클래스입니다. 아직 그렇지 않은 경우에도,검색할 수 없는 훔쳐서,그들은 그가 필요할 때,그들은 그보다 더 빨리 자신의 이전 대응하고 그들이 포함 기능을 사용할 수 없었던 그 이전 대응 따라서”마술”느낌은 그들이 당신을 떠날 당신이 그들을 사용할 때에 있습니다. 불행하게도,이러한 방법 남아 있는지,오늘날에도 거의 년이었기 때문에 공개 발표,그래서 많은 사람들을 깨닫지 않는 힘에서 사용할 수 있는 이러한 방법입니다. 이 기사에서는 PowerShell 을 사용할 때이 마법을 활용할 수 있도록 사용할 수있는 위치와 작동 방식을 설명하여이를 수정하려고합니다.

에 대한 참고 PowerShell3.0

전에 내가로 얻는 방법을 설명하는 ForEach 와는 방법이 작동,난 언급 할 필요가와 관련하여 이러한 두 가지 방법 및 PowerShell3.0. ForEach 와 Where 메소드가 PowerShell4.0 이상 버전 인 PowerShell3 에서만 사용 가능하다는 것은 사실이지만.0 은 여전히 널리 사용되는 많은 환경에서,그리고를 사용하지 않는 경우 PowerShell 는 환경에서는 표준에 PowerShell4.0 이상,당신은 자신을 찾을 수 있습니다 희망을 활용할 수 있는 구문에서 제공하는 새로운 방법을 사용하는 경우 PowerShell3.0. 나는 느낌이 제한 가치가 해결,그래서 그의 일환으로 TypePx 는 모듈을 나는 최근에 출판 GitHub 에서 및에서 PowerShell 리소스 갤러리(일명 PowerShellGet 공공장소에서는 현재 미리보기를 제한)포함한 ForEach 고 스크립트는 방법은 기능적으로 동등한 방법에 도입 PowerShell4.0 할 수 있도록 활용하여 새로운 구문과 기능을 사용하는 경우에도 PowerShell3.0. 이 구현에는 몇 가지 단점이 있습니다.이 기사 뒷부분에서 강조하겠습니다.

ForEach 방법

ForEach 수 있는 방법입니다 당신이 빠르게 반복하여 컬렉션을 통해 개체의 몇 가지 작업에는 각 개체의 모음입니다. 이 방법을 제공합니다 빠른 성능보다는 그 이전의 대응(foreach 문 ForEach 용 skype),그리고 그것은 또한 단순화의 일부는 가장 일반적인 작업을 수행 할 수 있습니다 개체에 대 컬렉션입니다. 이 메서드로 출력되는 모든 개체는 유형 시스템의 일반 컬렉션에서 반환됩니다.컬렉션.ObjectModel.이 코드는 다음과 같습니다.

여섯있는 방법을 지원할 수 있는 호출 이 방법,그리고 이러한 각각의 것서 더 자세히 설명 아래. ForEach 메서드를 호출할 때 사용할 수 있는 지원되는 인수는 다음과 같습니다:

  • ForEach(스크립트 블록 expression)
  • ForEach(type convertToType)
  • ForEach(string 속성)
  • ForEach(string 속성,개체 두 문자)
  • ForEach(문자열을 지정)
  • ForEach(문자열이 지,물체 인수)
  • ForEach(스크립트 블록의 표현,물체 인수)

이 지원되는 인수에 연결되지 않은 다른 오버로드를 사용할 수 있 ForEach 방법입니다. 이들 이외의 인수 페어링을 사용하면 실제 문제가 무엇인지 명확하게 식별하지 못하는 오류가 발생할 수 있습니다.

ForEach(스크립트 블록의 식)과 ForEach(스크립트 블록의 표현,물체 인수)

전달하는 경우 스크립트 블록의 표현으로 ForEach 방법은,당신을 수행할 수 있게 같은 종류의 작업을 하는 당신은 스크립트 블록에서 사용하는 것으로 foreach 문 또는 ForEach-체합니다. 또한 ForEach-Object cmdlet 과 마찬가지로$_및$PSItem 변수는 모두 처리중인 현재 항목을 참조합니다. 초기 스크립트 블록 인수를 넘어서 제공하는 모든 인수는 스크립트 블록의 인수로 사용됩니다. 이것은-ArgumentList 매개 변수가 ForEach-Object cmdlet 에서 작동하는 방식과 같습니다. 여기에는 방법을 보여주는 예제는 당신이 사용할 수 있는 이 스크립트를 실행하는 블록은 각 항목에 대 컬렉션:

# Get a set of services$services = Get-Service c*# Display the names and display names of all services in the collection$services.foreach{"$($_.Name) ($($_.DisplayName))"}# Select a property name to expand using a script block argument$services.foreach({param($PropertyName); $_.$PropertyName}, 'DisplayName')

발견 할 수 있습에 대한 이상한 구문을하지 않았기 때문에 나는 랩 스크립트 블록을 자체에서 부류입니다. 할 수 있는 포장에서 라운드 브래킷,그러나는에서 선택적 PowerShell4.0 이상이기 때문에 PowerShell parser 었을 할 수 있도록 개선에 대한 부류를 생략될 때마다 당신을 호출하는 방법을 허용하는 단일 블록 스크립트 인수입니다. 또한 foreach 문 및 ForEach-Object cmdlet 과 같이 제공하는 스크립트 블록이 현재 범위에서 호출됩니다. 즉,foreach 메소드 실행이 완료된 후 해당 스크립트 블록 내에서 만드는 모든 변수 할당이 유지됩니다.

ForEach(type convertToType)

독특한 ForEach 방법,전달할 수 있는 형식으로 ForEach 방법을 변환하려면 모든 항목에서 컬렉션으로 또 다른 유형입니다. 예를 들어,객체 모음이 있고 해당 객체를 문자열과 동등한 것으로 변환하고 싶다고 상상해보십시오. 여기에 무엇이 보이는 것과 같은 ForEach 방법:

# Get a collection of processes$processes = Get-Process# Convert the objects in that collection into their string equivalent$processes.foreach()

을 수행할 수 있는 동일한 작업에 의해 형변환 컬렉션으로 배열의 형식 문자열은(예를 들어]$프로세스),그리고 형변환을 배열은 사실이 크게 더 빠르게,그러나 거기에 아주 좋은 기회가 있는지 전혀 알 수 없을 정도의 차이에 실행 시간이면으로 작업하는 경우,매우 큰 컬렉션입니다. 에도 불구하고 시간 차이가 나는 것을 선호하는 경향이 ForEach 메소드는 구문에서는 특정 상황하는 경우 그것을 유지함에 의해 구현을 피해 추가 라운드 브래킷에서 스크립트가 작성합니다.

ForEach(string 속성)

PowerShell3.0 과 후,두 번째 매개 변수 설정에 추가 되었 ForEach-객체를 할 수 있도록 더 쉽게 검색 가치의 특정 속성에 의해 단순히 전달하는 속성 이름으로만 대한 매개 변수 값을 ForEach-체입니다. 이 편리함은 ForEach 방법에서도 제공되었습니다. 여기에는 방법을 보여주는 예제는 반복할 수 있을 통해 수집 및 반환성의 컬렉션:

# Get all services whose name starts with "w"$services = Get-Service w*# Return the names of those services$services.foreach('Name')

의 과정 버전 3.0 이상의 PowerShell,당신은 단순히 호출$서비스입니다.이름 이름을 얻는 모든 서비스는 완벽한 보다 빠르게 ForEach 방법안(하지만 당신만이 알 수 있는 성과에 차이가 매우 큰 컬렉션의 순서의 수천 수백 개체); 그러나,작동하는 위성에 있지 않는 경우에는 특별한 컬렉션을 자체,그리고 구문을 중 일부는 스크립트 작성자에게 그렇게 안락하지 않으로 인해 암시적 성격의 어떤 명령 않습니다. 새로운 ForEach 메소드 구문뿐만 아니라 좀 더 자체 문서화되는 추가 혜택이보다 명시 적 대안을 제공합니다.

ForEach(string propertyName,object newValue)

객체 컬렉션에서 속성을 검색 할 수있을뿐만 아니라 객체 컬렉션에서도 속성을 설정할 수 있습니다. 이렇게하려면 스크립트 블록을 명시 적으로 만들지 않는 한 다른 foreach 에서 사용할 수없는 기능입니다. 속성을 설정하려면,당신은 단순히 제공하는 시설 이름과 값을 사용할 때 설정하는 시설은 다음과 같습니다.

# Note, this is not a realistic example# This would be used more commonly on configuration data$services = Get-Service c*# Now change the display names of every service to some new value$services.foreach('DisplayName','Hello')

처럼 할당을 만들 것을 사용하여 같음 연산자,PowerShell 로 변환하려고 시도하면 무엇 때문에 당신이 제공하는 새로운 값으로 적절한 형식을 위해 제공되는 할당됩니다.

ForEach(문자열을 지정)및 ForEach(문자열이 지,물체 인수)

호출하는 방법은,당신은 단순히 당신을 제공 메서드 이름으로 첫 번째 인수,및 다음에 대해 인수하는 방법으로 두 번째,세 번째,네 번째,등등. 인수. 메소드가 인수를 취하지 않으면 메소드 이름에 간단히 전달할 수 있으며 인수없이 호출됩니다. 다음은 특정 프로그램을 실행하는 프로세스의 무리를 죽일 수있는 방법을 보여주는 예입니다:

# Get all processes running Chrome$processes = Get-Process -Name Chrome# Now kill all of those processes$processes.foreach('Kill')

여기에 또 다른 예를 들어,이번에 사용하는 방법과 함께 인수하면서 보여주는할 수 있는 방법을 확인하는 명령은 다음과 같은 최상의 방법을 사용하여 적합한 이름과 별칭에 대한 일반적으로 사용되는 매개변수:

# Get all commands that have a ComputerName parameter$cmds = Get-Command -ParameterName ComputerName# Now show a table making sure the parameter names and aliases are consistent$cmds.foreach('ResolveParameter','ComputerName') | Format-Table Name,Aliases

에서 볼 수 있듯 그 결과,확실히 일부에 불일치의 구현은 컴퓨터 매개변수는 수정해야합니다.ForEach 메서드에서 현재 사용할 수있는 모든 기능을 다루는

. 당신이 볼 수 있듯이,많이 하지는 새로운 기능에서 제공하는 이 방법이지만,구문 개선을 수행하는 경우에는 간단한 작업에서 컬렉션의 객체가 좋은,그리고 ForEach 방법 성능 향상과 비교했을 때 해당하는 foreach 문 for ForEach-체 파이프라인은 확실히 개선을 환영합니다. 그 설명이 밖으로 나와있는 방법으로,Where 방법으로 넘어 갑시다.

The Where method

Where 는 객체 컬렉션을 필터링 할 수있는 메소드입니다. 이처럼 매우디용 skype,그러나는 방법도 같은 선체 및 그룹-개체뿐만 아니라,여러 가지 추가적인 기능을 하는용 skype 기본적으로 지원하지 않습니다. 이 방법은 간단하고 우아한 명령에서 Where-Object 보다 빠른 성능을 제공합니다. ForEach 메서드와 마찬가지로이 메서드로 출력되는 모든 객체는 유형 시스템의 일반 컬렉션에서 반환됩니다.컬렉션.ObjectModel.수집 1.

다음과 같이 설명 할 수있는이 방법의 버전은 하나뿐입니다:

Where(scriptblock expression])

로 표시된 대괄호,표현 스크립트 블럭이 필요하며 모드 열거하고 numberToReturn 정수 인자가 선택할 수 있도록,호출이 사용하는 방법 1,2,3 인수입니다. 를 사용하려면 특정한 인수를 제공해야 합니다 모든 인수는 왼쪽에는 인수(즉,당신이 원하는 값을 제공 numberToReturn,당신은 값을 제공해야 합 모드 및 식뿐만 아니라).

Where(scriptblock expression)

Where 메소드의 가장 기본적인 호출은 단순히 스크립트 블록 식을 인수로 사용합니다. 스크립트 블록 표현식은 처리중인 컬렉션의 각 객체에 대해 한 번 평가되며 true 를 반환하면 Where 메소드에 의해 객체가 반환됩니다. 이것은 Where-Object cmdlet 을 호출하고 스크립트 블록을 전달하는 기능과 동일합니다. Where-Object cmdlet 과 마찬가지로$_및$PSItem 변수를 사용하여 스크립트 블록 내부에있는 동안 처리중인 현재 항목을 참조 할 수 있습니다.다음은 실행중인 서비스 목록을 얻을 수있는 방법을 보여주는 매우 간단한 예입니다.

# Get all services$services = Get-Service# Now filter out any services that are not running$services.where{$_.Status -eq 'Running'}

이 제공하지 않는 어떤 새로운 기능성,하지만 그것이 제공하는 훨씬 빠르게 성능보다는 객체와 이 구문은 매우 쉽게 따라,그래서 당신은 정말 고려해야 하는 이 스크립트를 수행할 때 클라이언트 측의 필터링 컬렉션이 있는 변수에 저장됩니다.

여기에서(스크립트 블록의 식 WhereOperatorSelectionMode mode)

을 시작할 때 보고에서 선택적 매개 변수는 방법,일을 시작은 훨씬 더 흥미 롭습니다. Windows PowerShell 버전 4.0 에는 typename Of System 이 포함 된 새로운 열거가 포함되었습니다.관리.자동화.여기서 운영자선택 모드. 해당 유형의 접미사에주의하십시오.이름:”SelectionMode”. Where 구문에서 강력한 선택 기능을 제공하는 데 사용됩니다. 다음은 정의와 함께이 열거형에 포함 된 값입니다:

Default 필터를 사용하여 컬렉션에 표현 스크립트 블록,최대 개수는 경우 하나의 제공 또는 불이행하는 모든 개체 컬렉션에 없는 경우에는 최대 카운트에서 제공되었 numberToReturn.
첫 번째 Return 첫 번째 N 체를 전달하는 표현 스크립트를 차단 필터 기본값으로 사용하는 1 개체하는 경우 특정 계산지 요청에 numberToReturn.
마지막 반환 마지막 N 체를 전달하는 표현 스크립트를 차단 필터 기본값으로 사용하는 1 개체하는 경우 특정 계산지 요청에 numberToReturn.
SkipUntil Skip 체에서 컬렉션을 때까지 개체에 전달하는 표현 스크립트를 차단 필터 및 그 첫 번째 N 체를 기본값으로 사용하는의 나머지 모든 개체가 없는 경우에는 최대 카운트에서 제공되었 numberToReturn.
까지 Return 첫 번째 N 체에서 컬렉션을 때까지 개체에 전달하는 표현 스크립트를 차단 필터 기본값으로 사용하는 모든 개체에 선행하는 첫 번째 목표는 전달되지 않은 경우 최대 개수에서 제공되었 numberToReturn.
Split 컬렉션을 분할 두 가지로 배치,모든 개체가 전달하는 표현 스크립트를 차단 필터링으로 컬렉션에 최대 수를 경우 중 하나에서 제공되었 numberToReturn,또는 모든 개체가 없다면의 최대 개수가 제공됩 와 모든 배치되지 않은 다른 개체에 넣어 처음으로 두 번째는 컬렉션입니다.

이러한 각각의 일부를 제공한 값을 처리할 때는 데이터의 컬렉션,그래서 나는 자세한 정보를 제공하의 각 선택 모드에서 아래.

Default

당연히 모드 인수의 기본값은’Default’입니다. 기본 선택 모드는 선택 모드를 전혀 제공하지 않을 때 얻는 것과 동일한 기능을 제공합니다. 예를 들어 이전 예제의 마지막 줄을 다음과 같이 작성할 수있었습니다:

# Now filter out any services that are not running$services.where({$_.Status -eq 'Running'},'Default')

에서 그 예를 들어,여분 인수할 필요가 없기 때문에,하지만 그것은 정확히 같은 것은 그것을 할 것을 제공하지 않은 경우 인수. 을 제공할 수 있습는 최대 객체개수를 설정한다.하려는 반환하는 동안 사용하는 기본적으로 선택 모드를 사용하 numberToReturn 인수,다음과 같이:

# Get the first 10 services in our collection that are running$services.where({$_.Status -eq 'Running'},'Default',10)

이것은 중요하다고 정확한 기능도 사용할 때 사용할 수 있는 첫 번째 선택 모드에서(우리 것에 대해 이야기에서는 순간),그래서 그것은 정말 아닙니다 실용적인을 사용하여 선택 매개 변수에 모두 사용할 때 기본적으로 선택 모드입니다.

첫 번째

짐작할 수 있겠지만,먼저 선택하는 모드를 선택할 수 있는 첫 번째 object(s)에서 컬렉션을 전달하는 스크립트 블록 식 필터입니다. NumberToReturn 인수의 값없이 First 를 사용하거나 numberToReturn 인수의 값이 0 인 First 를 사용하는 경우 필터를 통과하는 첫 번째 객체만 반환됩니다. 지정할 수도 있습니다 얼마나 많은 개체 반환에 numberToReturn 인수되는 경우에는 많은 개체 반환될 것(가정하고 있는 많은 개체는 통과하는 필터).

다음은 첫 번째 선택 모드를 보여주는 서비스 컬렉션을 사용하는 몇 가지 예입니다:

# Get the first service in our collection that is running$services.where({$_.Status -eq 'Running'},'First')# Get the first service in our collection that is running$services.where({$_.Status -eq 'Running'},'First',1)# Get the first 10 services in our collection that are running$services.where({$_.Status -eq 'Running'},'First',10)

두 번째 명령에서 이러한 예는 같은 결과를 반환하는 첫 번째 명령이기 때문에 그것은 단순히 명시적으로 전달하는 기본값의 numberToReturn 인수할 때 첫 번째 선택 모드에 사용됩니다.

마지막

마지막 선택 모드 기능을 훨씬 좋아하는 첫 번째 선택 모드를 선택할 수 있는 마지막 object(s)에서 컬렉션을 전달하는 스크립트 블록 식 필터입니다. NumberToReturn 인수의 값없이 Last 를 사용하거나 numberToReturn 인수의 값이 0 인 Last 를 사용하면 필터를 통과하는 마지막 객체만 반환됩니다. 지정할 수도 있습니다 얼마나 많은 개체 반환에 numberToReturn 인수되는 경우에는 많은 개체 반환될 것(가정하고 있는 많은 개체는 통과하는 필터).

다음은 마지막 선택 모드를 보여주는 서비스 컬렉션을 사용하는 몇 가지 예입니다:

# Get the last service in our collection that is running$services.where({$_.Status -eq 'Running'},'Last')# Get the last service in our collection that is running$services.where({$_.Status -eq 'Running'},'Last',1)# Get the last 10 services in our collection that are running$services.where({$_.Status -eq 'Running'},'Last',10)

또한 첫 번째 선택 모드에서 예를,두 번째 명령에서 이러한 예는 같은 결과를 반환하는 첫 번째 명령이기 때문에 그것은 단순히 명시적으로 전달하는 기본값의 numberToReturn 인수를 할 때 마지막 선택 모드에 사용됩니다.

SkipUntil

SkipUntil 모드 선택할 수 있습을 건너에 있는 모든 개체 컬렉션을 찾을 때까지 전달하는 스크립트 블록 식 필터입니다. 일단 당신이 찾을 수 있는 객체에 통과하는 필터,SkipUntil 모나 모든 객체를 반환에 남아있는 컬렉션에 값이 없는 경우 또는 0 의 값을 제공하 numberToReturn 인수,또는 그 반환됩니다 첫 번째 N 남아있는 개체를 수집하는 경우 보다 큰 값으로 제공하 numberToReturn 인수입니다. 두 경우 모두 결과에는 필터를 통과 한 첫 번째 개체가 포함됩니다.

다음은 서비스 컬렉션의 하위 집합을 사용하여 SkipUntil 선택 모드를 표시하는 몇 가지 예입니다:

# Get a collection of services whose name starts with "c"$services = Get-Service c*# Skip all services until we find one with a status of "Running"$services.where({$_.Status -eq 'Running'},'SkipUntil')# Skip all services until we find one with a status of "Running", then# return the first 2$services.where({$_.Status -eq 'Running'},'SkipUntil',2)

Until

Until 선택 모드는 SkipUntil 선택 모드의 반대 기능을 제공합니다. 스크립트 블록 표현식 필터를 통과하는 객체를 찾을 때까지 컬렉션의 객체를 반환 할 수 있습니다. 필터를 통과하는 객체를 찾으면 Where 메소드는 객체 처리를 중지합니다. 을 제공하지 않은 경우 값을 numberToReturn 인수 또는 제공하는 경우에는 0 값을 때까지 선택 모드에서 모든 객체를 반환에서 컬렉션을 선도하는 첫 번째 중 하나를 통과하는 스크립트 블록 식 필터입니다. 당신의 값을 제공합 numberToReturn 인수는 0 보다 큰지 선택 모드 반환에서 가장 번호,개체의 의미는 그것을 찾을 수 없습 객체를 전달하는 스크립트 블록 식 필터입니다.

여기에 몇 가지 예를 사용하여 다른 일부 서비스의 컬렉션을 표시까지 선택 모드에서 동작:

# Get a collection of services whose name starts with "p"$services = Get-Service p*# Return all services until we find one with a status of "Stopped"$services.where({$_.Status -eq 'Stopped'},'Until')# Return the first 2 services unless we find one with a status of# "Stopped" first$services.where({$_.Status -eq 'Stopped'},'Until',2)

Split

분할 선택 모드에서는 유일하다. 새 컬렉션에서 시작하는 컬렉션의 하위 집합을 반환하는 대신 내부적으로 두 개의 개별 컬렉션을 포함하는 새 컬렉션을 반환합니다. 이러한 중첩 된 컬렉션에 포함 된 내용은 분할 선택 모드를 사용하는 방법에 따라 다릅니다. 분할을 사용하면 개체 모음을 두 개로 분할할 수 있습니다. 기본적으로하지 않는 경우 값을 제공합 numberToReturn 인수 또는 제공하는 경우에는 0 의 값에 대한 numberToReturn 인수,분할 모든 객체를 전달하는 스크립트 블록 식 필터로 처음 중첩된 컬렉션에는 모든 다른 물체(지 않는 사람들을 통과하는 스크립트 블록 식 필터)두 번째로 중첩된 컬렉션입니다. 는 경우에 당신을 제공 0 보다 큰 값에 대한 numberToReturn 인수,분할의 크기를 제한 첫 번째는 컬렉션하는 최대 금액을,그리고 나머지 모든 개체 컬렉션에서도 그에 일치하는 스크립트 블록 식 필터가 될 것입니다,배치로 두 번째는 컬렉션입니다.

여기에 몇 가지 예는 방법을 보여주는 분할 모드 선택을 분할하는 데 사용할 수 있는 최대 객체의 컬렉션은 다른 방법:

# Get all services$services = Get-Service# Split the services into two groups: Running and not Running$running,$notRunning = $services.Where({$_.Status -eq 'Running'},'Split')# Show the Running services$running# Show the services that are not Running$notRunning# Split the services into the same two groups, but limit the Running group# to a maximum of 10 items$10running,$others = $services.Where({$_.Status -eq 'Running'},'Split',10)# Show the first 10 Running services$10running# Show all other services$others

에서 볼 수 있듯이 이를 들어,분할은 매우 강력 모드 선택을 제공하는 혼합의 필터링 그룹,그리고 선택에서 하나의 명령을 호출합니다.

이 컬렉션의 선택 모드를 만드는 방법을 가장 빠르고,가장 고급스러운 동시에 아직보다 더 강력한 곳체,그룹-개체고 선택을 개체에 결합하여 하나의 파이프라인. 그것에 대해 사랑하지 않는 것은 무엇입니까?

의 단점을 ForEach 고 스크립트 방법에 TypePx

앞서 언급했듯이 이 문서에서는 내가 쓴 유형 확장을 위해 PowerShell3.0 이상 및 TypePx 라는 모듈로 패키지. TypePx 는 PowerShell 에서 완전히 작성된 스크립트 모듈이며 PowerShell3.0 이상에서 실행됩니다. 를 사용하는 경우 PowerShell3.0(고 사용하는 경우에만 PowerShell3.0),TypePx 정의 ForEach 고 스크립트 방법을 모방하는 행동의 ForEach 와는 방법에 PowerShell4.0 이상. 는 확장 유형을 시스템에서 PowerShell 가능하게 모방 이 행동은 몇 가지 결손으로 인해 구현되는 것에 PowerShell 는 영향을 얼마나 나가 갈 수 있으로 이러한 유형 확장을 확장합니다. 이 섹션에서 설명하는 일부의 차이점과 한계에 존재하는 ForEach 고 스크립트 방법에 TypePx 할 수 있는 것을 알고 사용하는 경우 PowerShell3.0.

블록 스크립트에서 호출되는 스크립트 방법을 실행에 아동 범위

과는 달리 ForEach 어디서 구현하는 방법을의 한 부분으로 PowerShell4.0 나 나중에 호출하여 표현 스크립트 블록의 현재 범위에서 메소드가 호출되는 ForEach 어디서 스크립트를 구현하는 방법을 PowerShell3.0 를 호출하여 표현 스크립트 블록 아이의 범위가 있습니다. 이러한 제한이 있 PowerShell 에서는 거기에 아주 처음부터(제한 추가할 수 있습니다,나는 지금까지의 가장 큰 단점의 PowerShell 언어로).

이 제한으로 인해 표현식 스크립트 블록 내부에 할당하는 모든 변수는 자식 범위에서만 수정됩니다. 표현식 스크립트 블록이 ForEach 또는 Where 를 호출하는 범위의 변수를 업데이트하려는 경우 이는 의미가 있습니다. 가능성은 이렇게 되면 사용하는 동안 문제가 있지 않기 때문에 매우 일반적인 수정에서 변수는 표현 스크립트를 차단하지만,ForEach 스크립트 블록이 문제가 될 수도 있습 유지할 필요가 있으므로 이 점을 염두에 사용하는 경우 이러한 확장자.

I 참고해야는 다음과 같이 제거한 것,그리고 내가 믿고 할 수 있을 것입니다 그래서,그러나 당시에 이 문서에서 나는 아직 구현되지 않았는 해결합니다.

대부분이지만,모든 컬렉션이 있 ForEach 와는 방법

PowerShell4.0 이상 ForEach 와는 방법은 마술로 사용할 수 있는 모든 유형을 구현하는페를 제외하고,문자열 XmlNode,그리고 유형을 구현하는 IDictionary. PowerShell 에서 extended type 시스템은 인터페이스에 대해 확장을 생성 할 수 없으며 유형에 대해서만 확장 기능을 만들 수 있습니다. ForEach 와 Where 와 같은 광범위한 확장을 만들고 싶다면 도전 과제입니다. 현재 구현에서는 이러한 확장에서 TypePx,the TypePx 모듈을 발견한 모든 유형에 있는 모든 어셈블리에 로드되어 현재 응용 프로그램을 도메인이 아닌 모든 일반적인 형태를 정의하는페이지만 IDictionary(제외한 문자열과 XmlNode),플러스에 대한 모든 일반적인 형태를 정의하는페이지만 IDictionary 에 대한 일반적인 컬렉션의 PSObject,Object,String,Int32,또는 Int64,ForEach 고 스크립트 방법을 만든 것입니다.

이의 큰 숫자를 포함하는 형식에서는 내 자신 테스트에 충분했습니다,그러나 당신이 실행될 수 있습으로 유형을 사용하려는 이러한 방법들을 사용할 수 없습니다. 이 경우 GitHub 를 통해 알려 주시면 내가 할 수있는 일을 살펴 보겠습니다. 이것은 또한 제한 나 제거하고 싶지만,시간이 더 필요할 연구를 구현하는 방법에서 동일한 기능을 컴파일된 어셈블리가 할 수 있을 정의하는 그것이 더 좋아에서 정의된 PowerShell4.0 이상.

PowerShell 스크립트는 빠르게 컴파일 된 코드

이것은 말할 필요도 없죠,하지만 작성할 때에 뭔가 PowerShell,는 해석되어,그것은 한 빨리 실행할 수 있도록 지원하는 것을 작성한 경우에는 해당 논리에서 같은 언어는 C#. 이것은 절대적으로 케이스에 대한 ForEach 고 스크립트 방법을 사용하여 내부적으로 ForEach-체,어디로체,그리고 파이프라인을 모방하는 행동의 기본 ForEach 와는 방법이 있습니다. 이 경우의 장점은 이러한 명령어에서 제공한 구문을 제공하는 기능,플러스 사용할 수 있는 이 스크립트에 대한 PowerShell3.0 4.0. ForEach 및 Where 의 성능 이점은 PowerShell4.0 기본 구현에만 있습니다.

PowerShell3.0 필요한 부류의 주위에 모든 방법을 매개 변수를

I 언급한 위의 예에서 나는 할 수 있었을 호출하는 방법으로 단일 리터럴 스크립트 블록을 매개 변수 포장 없이는 리터럴 스크립트 블록에 추가됐다. 그 기능은 PowerShell4 에서만 존재합니다.그 릴리스의 파서에 만들어진 개선으로 인해 0 이상. 에 PowerShell3.0 파서 지원하지 않는,그래서 괄호는 항상하기 위해 필요한 ForEach 어디서 스크립트를 작동하기위해 이 방법을 하나로 리터럴 스크립트 블록에서 매개 변수는 버전입니다.

결론

시작했을 때 나는 노력을 모방하는 행동의 ForEach 및 마법 방법에 PowerShell3.0 하지 않았다,나는 매우 실현하는 방법을 많은 기능들을 제공합니다. 굴착 기술적 세부사항으로 이 방법 그래서 내가 만들 수있는 확장 가고 싶은 TypePx 도움을 폭로의 숨겨진 기능에서 이러한 매우 강력한 방법이며,나는 매우 행복을 나누고 그와 함께 이 문서에서 당신. 이 정보가 PowerShell3.0 을 여전히 사용하고 있더라도 PowerShell 작업에서이 멋진 새로운 기능 세트를 활용하는 데 도움이되기를 바랍니다. 행복한 스크립팅!