파이프라인에서 $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
'IT' 카테고리의 다른 글
예외 발생 시 데이터베이스 연결을 닫는 최상의 설계 패턴 (0) | 2023.09.25 |
---|---|
VBA로 특정 열을 삭제하는 방법은? (0) | 2023.09.25 |
콘솔 및 파일 첨부 파일을 사용한 매우 간단한 log4j2 XML 구성 파일 (0) | 2023.09.25 |
관계형 데이터베이스의 사용자 정의 필드 설계 패턴 (0) | 2023.09.25 |
vuejs의 temp 값이 있는 테이블에서 새 레코드를 추가하는 방법 (0) | 2023.09.25 |