PowerShell에서 $ _의 의미는 무엇입니까?


226

PowerShell에서 다음을 많이 보았지만 정확히 무엇을합니까?

$_

5
물론이 질문에는 주어진 단일 특수 토큰에 대한 답변이 있지만 PowerShell의 모든 특수 토큰을
보여주는

답변:


171

이것은 파이프 라인의 현재 값에 대한 변수 $PSItem이며 Powershell 3 이상에서 호출 됩니다.

1,2,3 | %{ write-host $_ } 

또는

1,2,3 | %{ write-host $PSItem } 

예를 들어 위의 코드 %{}에서 배열의 모든 값에 대해 블록이 호출됩니다. $_또는 $PSItem변수는 현재 값을 포함합니다.


42
반드시 파이프 라인과 관련이있는 것은 아닙니다. "현재 실행중인 스크립트 블록에 대한 현재 인수"입니다. 예를 들어, 당신은에 잘 사용할 수있는 동안 ForEach-ObjectWhere-Object처럼 당신이 뭔가에 사용할 수 없습니다 Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)- 따라서 더 포함 파이프 라인,하지만 스크립트 블록과가 없습니다 $_. (즉, PowerShell 도움말은 $_. 혼란을 위한 파이프 라인을 말합니다 .)
Joey

@Joey 당신의 예제에서 절대적으로 $ _를 사용할 수 있습니다. Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous

@Xalorous : 그것이 작동하는 것을 의미하지 않는다 오류가 발생하지 않습니다해서 : Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar... 음, 그것은 할 수 당신이있는 경우에 작동 $_당신이 파이프 라인을 실행하고있는 범위에. 그러나 그것은 그런 것을 쓰려고 할 때 일반적으로 의미하는 것과는 매우 다릅니다.
Joey

$_어떤 이유로 든 @Joey 는 어떤 이유로 든 모든 객체를 반복하지 않습니다. 대신 사용해보십시오. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar. 내가 가진 것으로 의심 gci | cmdlet명시 적 foreach는하지 않고하는 GCI 결과를 수집하고이 cmdlet에 배열을 전달합니다. 그러나 배열은 객체이므로 배열 객체에 속성을 추가합니다. 배열에 'name'속성이 없으므로 $ _. Bar에 지정된 값은 $ null입니다. 결론적으로 $ _는 파이프 라이닝과 함께 광범위하게 사용됩니다. 루핑하기 위해 % {}가 필요하지 않은 것은 새로운 것입니다.
Xalorous

추가 파이프 라인이 제거 된 작업 버전. gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous

37

C #에서 람다 식의 입력 매개 변수와 같이이 변수를 생각하는 가장 쉬운 방법은 생각합니다. 즉 $_유사하다 x에서 x => Console.WriteLine(x)C #의 익명 함수. 다음 예를 고려하십시오.

PowerShell :

1,2,3 | ForEach-Object {Write-Host $_}

인쇄물:

1
2
3

또는

1,2,3 | Where-Object {$_ -gt 1}

인쇄물:

2
3

LINQ를 사용하여 이것을 C # 구문과 비교하십시오.

var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));

인쇄물:

1
2
3

또는

list.Where( _ => _ > 1)
    .ToList()
    .ForEach(s => Console.WriteLine(s));

인쇄물:

2
3

6
C #에서는 _람다에서 입력 매개 변수로 사용하지 마십시오 . _매개 변수를 무시할 때 가끔 사용되는 경우 대신 x를 사용하십시오. stackoverflow.com/questions/424775/…
Carlos Muñoz

28

웹 사이트 에 따르면 this, 대부분의 루프에 대한 참조 입니다.

$ _ (달러 밑줄) 'THIS'토큰. 일반적으로 foreach 루프 내부의 항목을 나타냅니다. 작업 : 컬렉션의 모든 항목을 인쇄합니다. 해결책. ... | foreach {쓰기 호스트 $ _}


3
this$_변수에 대해 다소 혼란스러운 용어입니다 . OOP에서는 일반적으로 변수가 아닌 클래스를 참조합니다.
oɔɯǝɹ

1
@remco 특히 PS v5가 클래스에서 사용하기 위해 $ this 변수를 추가 할 때.
Xalorous


1

$ _는 이전 | 객체에서 전달 된 각 객체 / 요소를 반복하는 변수입니다. (파이프).


1

$_는 시스템에서 일반적으로 Where-Objectand와 같은 파이프와 함께 사용되는 cmdlet에서 참조하는 블록 식 내부에서 만든 변수입니다 ForEach-Object.

그러나 다른 유형의 표현식에서도 사용할 수 있습니다 (예 : Select-Object표현식 특성 과 결합). Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}. 이 경우는 $_파이프되는 항목을 나타내지 만 여러 표현식이 존재할 수 있습니다.

스크립트 블록을 사용하여 값의 유효성을 검사하는 사용자 지정 매개 변수 유효성 검사로 참조 할 수도 있습니다. 이 경우, $_는 호출에서 수신 한 매개 변수 값을 나타냅니다.

c # 및 java와 가장 유사한 것은 lamda 식입니다. powershell을 기본으로 분류하면 모든 것이 스크립트 파일 a, 함수 및 cmdlet을 포함하는 스크립트 블록입니다. 자체 매개 변수를 정의 할 수 있지만 처리 / 평가할 입력 항목을 나타내는 시스템에서 매개 변수를 생성하는 경우가 있습니다 . 이러한 상황에서 자동 변수는 $_입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.