IT

파이프라인에서 $null을 처리하는 방법

itgroup 2023. 9. 25. 22:34
반응형

파이프라인에서 $null을 처리하는 방법

PowerShell 코드에는 종종 다음과 같은 상황이 발생합니다.객체의 집합을 반환하는 함수 또는 속성이 있습니다.$null. 결과를 파이프라인에 밀어넣으면 다음과 같은 경우에도 파이프라인의 요소를 처리합니다.$null는 유일한 요소입니다.

예:

$Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }

피쳐($Project)가 없는 경우.기능은 $null)을 반환합니다. "기능 이름:"이 있는 한 줄이 나타납니다.

이를 해결할 수 있는 세 가지 방법이 있습니다.

if ($Project.Features -ne $null)
{
  $Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }
}

아니면

$Project.Features | Where-Object {$_ -ne $null) | Foreach-Object { 
  Write-Host "Feature name: $($_.Name)" 
}

아니면

$Project.Features | Foreach-Object { 
  if ($_ -ne $null) {
    Write-Host "Feature name: $($_.Name)" }
  }
}

하지만 사실 저는 이런 접근법들이 마음에 들지 않습니다만, 무엇이 가장 좋은 접근법이라고 보십니까?

나는 "foreach ($null) {}"과 "$null | foreach-object {}"가 모두 한 번씩 반복된다는 사실을 아무도 좋아하지 않는다고 생각합니다.유감스럽게도 당신이 보여준 방법 외에는 다른 방법이 없습니다.당신이 더 인색할 수도 있습니다.

$null | ?{$_} | % { ... }

?{$_}의 줄임말입니다where-object {$_ -ne $null}~하듯이$null부울 식으로 평가하면 다음과 같이 처리됩니다.$false

내 프로필에는 다음과 같은 필터가 정의되어 있습니다.

filter Skip-Null { $_|?{ $_ } }

용도:

$null | skip-null | foreach { ... }

필터는 기본 블록이 엔드 {}이(가) 아닌 프로세스 {}인 경우를 제외하고는 기능과 동일합니다.

업데이트: PowerShell 3.0 기준,$null더 이상 컬렉션으로 사용할 수 없습니다.야호!

-오이신

함수를 수정할 수 있는 경우 $null 대신 빈 수집/배열을 반환하도록 하십시오.

PS> function Empty { $null }
PS> Empty | %{'hi'}
hi

PS> function Empty { @() }
PS> Empty | %{'hi'}

그렇지 않으면 Oisin이 제안하는 대로 하세요. 비록 제가 약간의 수정을 제안하지만요.

filter Skip-Null { $_|?{ $_ -ne $null } } 

그렇지 않으면 필터링도 수행됩니다.0그리고.$false.

업데이트 4-30-2012:이 문제는 PowerShell v3에서 해결되었습니다.V3는 스칼라 $null 값을 반복하지 않습니다.

완성하기 위한 Keith의 답변에 대한 간단한 메모

개인적으로, 저는 아무것도 돌려주지 않을 겁니다.일리가 있습니다.

PS> function Empty { if ('a' -eq 'b') { 'equal' } }
PS> Empty | % { write-host result is $_ }

하지만 당신이 결과를 할당하면 당신은 문제에 빠집니다.Empty변수에 대해:

PS> $v = Empty
PS> $v | % { write-host result is $_ }

그것을 효과적으로 만들기 위한 작은 속임수가 있습니다.결과만 포장하면 됩니다.Empty다음과 같은 배열로:

PS> $v = @(Empty)
PS> $v | % { write-host result is $_ }
PS> $v.GetType()
IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     Object[]  System.Array
PS> $v.Length
0

또 다른 가능성:

$objects | Foreach-Object -Begin{If($_ -eq $null){continue}} -Process {do your stuff here}

정보_계속에 대한 자세한 내용

언급URL : https://stackoverflow.com/questions/4356758/how-to-handle-null-in-the-pipeline

반응형