2014-09-10 2 views
-1

파이프가 일부 PowerShell 출력 이후 {$ _}이 (가) 여기에 있습니다. 누군가 내게 설명해 달라는 점을 설명해 줄 수 있습니까? ? {$ _}을 포함하지 않고 (명백한 시각적 출력 차이는 제외)? 이것은 더 큰 스크립트 나 다른 것의 일부가 아니기 때문에 PowerShell에서 시작하여 기본 복잡성에 대해 이해하려고합니다. 내가 정규식 부분을 사용하여 분할 이해합니다. 당신이 ? 속기를 사용하는 경우

PS C:\Users\oucs0058> $pc = "123456789ABCDE" 
PS C:\Users\oucs0058> $pc -split '(..)' 

12 

34 

56 

78 

9A 

BC 

DE 

PS C:\Users\oucs0058> $pc -split '(..)' | ? {$_} 
12 
34 
56 
78 
9A 
BC 
DE 
+0

'? {$ _}'다음과 같이 읽으십시오 :'실제 값 파이프 된 값이 널이 아닌 곳 ' –

+0

확실하게 널 (null)이 없습니까? (또는 오히려 확실하게 첫 번째 결과가 나옵니다). Null이있는 이유는 무엇입니까? – Daz

+0

사실 그것은 nulls가 아니지만 빈 문자열입니다. 그러나'$ null'은'boolean '으로 캐스팅 될 때'$ false'이므로 아무런 차이가 없습니다 (캐스팅에 대한 내 답변 참조). – PeterK

답변

3

, 당신은 실제로 Where-Object cmdlet을 사용하고 있습니다. 이 cmdlet은 인수 스크립트 블록을 평가합니다.이 스크립트 블록은 부울 값으로 반환되어야합니다. 평가가 $true으로 돌아 가면 입력 개체가 파이프 라인으로 전달되고 평가 결과가 $false으로 반환되면 무시됩니다. 예를 들어 Where-Object $true은 모든 입력 개체를 전달하고 Where-Object $false은 아무 것도 전달하지 않습니다.

스크립트 블록은 아무 것이나 결과는 부울로 캐스팅됩니다. 이 때문에 {$_}을 쓸 때 입력 문자열 객체를 부울로 캐스팅합니다. PowerShell은 빈 문자열을 $false으로 캐스팅하고 비어 있지 않은 문자열은 $true으로 캐스팅합니다.

$pc -split '(..)' 명령은 문자열 개체 목록을 반환하며 그 중 1 초마다 비어 있습니다. 이로 인해 {$_}은 빈 문자열의 경우 $false을 반환하고 비어 있지 않은 문자열의 경우 $true을 반환하고 나머지는 매우 단순한 경우 나머지를 반환합니다. Where-Object은 비어 있지 않은 문자열을 전달하고 비어있는 문자열은 무시합니다. HTH.

+0

정보를 제공해 주셔서 감사합니다. 그런 다음 첫 번째 부분에서 분할을 수행 할 때 두 번째 문자열이 모두 비어있는 이유는 무엇입니까? – Daz

+0

좋은 질문, 나는 _think_ .NET String.split() 동작과 관련이 있습니다. _ "여러 개의 일치 항목이 서로 인접 해 있으면 빈 문자열이 배열에 삽입됩니다."_ (http : // msdn.microsoft.com/en-us/library/ze12yx1d(v=vs.110).aspx). 이 조건은 입력 + 정규식에 의해 충족됩니다. – PeterK

+0

좋은 정보와 msdn 링크 +1! – Daz

관련 문제