답변:
이것은 파이프 라인의 현재 값에 대한 변수 $PSItem
이며 Powershell 3 이상에서 호출 됩니다.
1,2,3 | %{ write-host $_ }
또는
1,2,3 | %{ write-host $PSItem }
예를 들어 위의 코드 %{}
에서 배열의 모든 값에 대해 블록이 호출됩니다. $_
또는 $PSItem
변수는 현재 값을 포함합니다.
ForEach-Object
나 Where-Object
처럼 당신이 뭔가에 사용할 수 없습니다 Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- 따라서 더 포함 파이프 라인,하지만 스크립트 블록과가 없습니다 $_
. (즉, PowerShell 도움말은 $_
. 혼란을 위한 파이프 라인을 말합니다 .)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... 음, 그것은 할 수 당신이있는 경우에 작동 $_
당신이 파이프 라인을 실행하고있는 범위에. 그러나 그것은 그런 것을 쓰려고 할 때 일반적으로 의미하는 것과는 매우 다릅니다.
$_
어떤 이유로 든 @Joey 는 어떤 이유로 든 모든 객체를 반복하지 않습니다. 대신 사용해보십시오. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. 내가 가진 것으로 의심 gci | cmdlet
명시 적 foreach는하지 않고하는 GCI 결과를 수집하고이 cmdlet에 배열을 전달합니다. 그러나 배열은 객체이므로 배열 객체에 속성을 추가합니다. 배열에 'name'속성이 없으므로 $ _. Bar에 지정된 값은 $ null입니다. 결론적으로 $ _는 파이프 라이닝과 함께 광범위하게 사용됩니다. 루핑하기 위해 % {}가 필요하지 않은 것은 새로운 것입니다.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
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
_
람다에서 입력 매개 변수로 사용하지 마십시오 . _
매개 변수를 무시할 때 가끔 사용되는 경우 대신 x를 사용하십시오. stackoverflow.com/questions/424775/…
$ _은 (는 ) 파이프의 현재 항목을 나타내는 자동 변수 $ PSItem (PowerShell V3.0에 도입 됨, 여기에서 사용 정보 참조 ) 의 별칭입니다 .
자동 변수에 대한 PowerShell (v6.0) 온라인 설명서는 여기에 있습니다 .
$_
는 시스템에서 일반적으로 Where-Object
and와 같은 파이프와 함께 사용되는 cmdlet에서 참조하는 블록 식 내부에서 만든 변수입니다 ForEach-Object
.
그러나 다른 유형의 표현식에서도 사용할 수 있습니다 (예 : Select-Object
표현식 특성 과 결합). Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. 이 경우는 $_
파이프되는 항목을 나타내지 만 여러 표현식이 존재할 수 있습니다.
스크립트 블록을 사용하여 값의 유효성을 검사하는 사용자 지정 매개 변수 유효성 검사로 참조 할 수도 있습니다. 이 경우, $_
는 호출에서 수신 한 매개 변수 값을 나타냅니다.
c # 및 java와 가장 유사한 것은 lamda 식입니다. powershell을 기본으로 분류하면 모든 것이 스크립트 파일 a, 함수 및 cmdlet을 포함하는 스크립트 블록입니다. 자체 매개 변수를 정의 할 수 있지만 처리 / 평가할 입력 항목을 나타내는 시스템에서 매개 변수를 생성하는 경우가 있습니다 . 이러한 상황에서 자동 변수는 $_
입니다.