PowerShell에서 $null 어레이를 테스트하는 방법
PowerShell 2.0의 배열 변수를 사용하고 있습니다.값이 없으면 $null이 되며, 이를 성공적으로 테스트할 수 있습니다.
PS C:\> [array]$foo = $null
PS C:\> $foo -eq $null
True
하지만 값을 지정해도 $null에 대한 테스트는 아무것도 반환하지 않습니다.
PS C:\> [array]$foo = @("bar")
PS C:\> $foo -eq $null
PS C:\>
어떻게 "-eq $null"이 결과를 제공하지 않을 수 있습니까?$null이거나 그렇지 않습니다.
$null과 비교하여 어레이가 채워졌는지 여부를 확인하는 올바른 방법은 무엇입니까?
배열이므로 내용을 테스트할 카운트를 찾고 있습니다.
추천합니다
$foo.count -gt 0
이것의 "이유"는 PSH가 수집 객체의 비교를 처리하는 방법과 관련이 있습니다.
피연산자 순서를 변경할 수 있습니다.
$null -eq $foo
참고:-eq
PowerShell에서는 동등성 관계가 아닙니다.
if($foo -eq $null) { "yes" } else { "no" }
help about_comparison_operators
도움말이 표시되며 다음 텍스트가 포함됩니다.
격납 연산자(-포함, -포함)와 형식 연산자(-is, -isnot)를 제외한 모든 비교 연산자는 연산자에 대한 입력(연산자 왼쪽의 값)이 단일 값(스칼라)일 때 부울 값을 반환합니다.입력이 값의 집합인 경우 격납 연산자와 유형 연산자는 일치하는 값을 반환합니다.컬렉션에 일치하는 항목이 없으면 이러한 연산자는 아무것도 반환하지 않습니다.격납 연산자와 형식 연산자는 항상 부울 값을 반환합니다.
솔루션에서 true/false가 아닌 0을 반환해야 하는 경우 다음과 같은 이점이 있습니다.
PS C:\> [array]$foo = $null
PS C:\> ($foo | Measure-Object).Count
0
이 작업은 어레이의 카운트 속성과 다릅니다. 다음과 같은 이유로Measure-Object
개체 수를 세는 중입니다.없기 때문에 0을 반환합니다.
다른 답변들은 질문의 주요 요점을 다루지만, 이 부분에 대해 언급하자면...
PS C:\> [array]$foo = @("bar") PS C:\> $foo -eq $null PS C:\>
어떻게 "-eq $null"이 결과를 제공하지 않을 수 있습니까?$null이거나 그렇지 않습니다.
처음에는 혼란스럽지만, 그것이 당신에게 결과를 주고 있습니다.$foo -eq $null
단지 결과에 표시 가능한 표현이 없을 뿐입니다.
부터$foo
배열을 가지고 있습니다.$foo -eq $null
의미는 "다음 요소를 포함하는 배열을 반환합니다.$foo
와 동등한$null
의 요소가 있습니까?$foo
와 동등한$null
아니요, 그래서$foo -eq $null
빈 배열을 반환해야 합니다.문제는 콘솔에 빈 배열이 표시될 때...아무것도...
PS> @()
PS>
배열은 여전히 거기에 있습니다. 요소를 볼 수 없더라도...
PS> @().GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> @().Length
0
유사한 명령을 사용하여 다음을 확인할 수 있습니다.$foo -eq $null
우리가 "볼" 수 없는 배열을 반환하는 것입니다.
PS> $foo -eq $null
PS> ($foo -eq $null).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> ($foo -eq $null).Length
0
PS> ($foo -eq $null).GetValue(0)
Exception calling "GetValue" with "1" argument(s): "Index was outside the bounds of the array."
At line:1 char:1
+ ($foo -eq $null).GetValue(0)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IndexOutOfRangeException
인덱서를 사용하는 대신 메서드를 호출합니다(예:($foo -eq $null)[0]
왜냐하면 후자가 돌아오기 때문입니다.$null
하지 않은 하지 않은 $null
.
테스트를 해보면 비슷한 행동을 보입니다.$null
/포함에가 포함된 에 포함$null
요소...
PS> $bar = @($null)
PS> $bar -eq $null
PS> ($bar -eq $null).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> ($bar -eq $null).Length
1
PS> ($bar -eq $null).GetValue(0)
PS> $null -eq ($bar -eq $null).GetValue(0)
True
PS> ($bar -eq $null).GetValue(0) -eq $null
True
PS> ($bar -eq $null).GetValue(1)
Exception calling "GetValue" with "1" argument(s): "Index was outside the bounds of the array."
At line:1 char:1
+ ($bar -eq $null).GetValue(1)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IndexOutOfRangeException
이경에는우,,$bar -eq $null
하의요소포를배함반열환합을 포함하는 배열을 합니다.$null
콘솔에 시각적으로 표시되지 않는...
PS> @($null)
PS> @($null).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> @($null).Length
1
당신은 일이 어떻게 진행되기를 원합니까?
요소가 없는 배열을 할당되지 않은 배열과 동일하게 처리하려면 다음을 사용합니다.
[array]$foo = @() #example where we'd want TRUE to be returned
@($foo).Count -eq 0
빈 배열이 값을 가진 것으로 표시되도록 하려면 다음을 사용합니다.
[array]$foo = @() #example where we'd want FALSE to be returned
$foo.PSObject -eq $null
null 값만 채워진 배열을 null로 처리하려면 다음을 수행합니다.
[array]$foo = $null,$null
@($foo | ?{$_.PSObject}).Count -eq 0
NB:는 NB: 위서사니다합용에를 합니다.$_.PSObject
1파운드가 $_
해서를 [bool]$false
,[int]0
,[string]''
등이 필터링되지 않도록 합니다. 여기서 우리는 null에만 집중합니다.
스위치 조심하세요.빈 디렉토리의 출력과 같이 null 배열로 실행되지 않습니다.
switch ( $null ) { default { 'yes' } }
yes
switch ( @() ) { default { 'yes' } } # no output
mkdir foo
switch ( dir foo ) { default { 'yes' } } # no output
이 모든 대답이 저에게 효과가 있는 것은 아닙니다.저는 결국 이것을 부울적인 것처럼 다루었습니다.
$foo = @()
if (! $foo) { 'empty array' }
empty array
사실, 저는 어떤 물체 안에서 배열 목록을 발견했습니다.
[pscustomobject]@{config = [Collections.ArrayList]@()} | ? { ! $_.config }
config
------
{}
언급URL : https://stackoverflow.com/questions/5111572/how-to-test-for-null-array-in-powershell
'programing' 카테고리의 다른 글
PHP 사전 설정은 허용되는 숫자만 대체합니다. (0) | 2023.08.22 |
---|---|
오라클에서 행이 있는지 확인하는 가장 빠른 쿼리? (0) | 2023.08.22 |
Android: 작업 표시줄의 사용자 지정 레이아웃에서 왼쪽 여백 제거 (0) | 2023.08.22 |
각도 - 관찰 가능한 비동기 파이프 사용각도 - 관찰 가능한 비동기 파이프 사용html의 로컬 변수에 바인딩합니다.html의 로컬 변수에 바인딩합니다.안녕하세요. 많은 속성(이름, 제목, 주소...)을 .. (0) | 2023.08.22 |
애플리케이션 컨텍스트 초기화 이벤트에 후크를 추가하는 방법은 무엇입니까? (0) | 2023.08.22 |