PowerShell 개체가 있는지 확인하는 가장 좋은 방법은 무엇입니까?


92

Com 개체가 있는지 확인하는 가장 좋은 방법을 찾고 있습니다.

내가 가지고있는 코드는 다음과 같습니다. 마지막 줄을 개선하고 싶습니다.

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true

$ie -ne $null #Are there better options?

답변:


115

나는 스틱 것 $null이외의 값 이후 체크 ''(빈 문자열) 0, $false$null검사를 통과합니다 if ($ie) {...}.


1
if ($ val) {...}을 사용하려면 부울에 더 적합합니다. 다른 모든 검사는 if ($ val -ne $ null) {..} 직접 테스트해야합니다. TY @Keith 힐
일리아 Gurenko

68

당신은 또한 할 수 있습니다

if ($ie) {
    # Do Something if $ie is not null
}

4
나는이 옵션과 부정 좋아if (-not $ie) { # Do something if $ie doesn't exist/is falsey }
크리스 마 그누

16

특정 예에서는 확인을 전혀 수행 할 필요가 없습니다 . New-Objectnull 을 반환 하는 것이 가능 합니까? 나는 그것을 본 적이 없다. 문제가 발생하면 명령이 실패해야하며 예제의 나머지 코드는 실행되지 않습니다. 그렇다면 우리는 왜 그 검사를해야합니까?

아래 코드에서만 몇 가지 검사가 필요합니다 ($ null과의 명시 적 비교가 가장 좋습니다).

# we just try to get a new object
$ie = $null
try {
    $ie = New-Object -ComObject InternetExplorer.Application
}
catch {
    Write-Warning $_
}

# check and continuation
if ($ie -ne $null) {
    ...
}

1
COM 개체 유형이 없으면 New-Object에서 예외가 발생합니다. 하지만 어떻게 null을 반환 할 수 있는지 모르겠습니다. 또한 Exception을 무시하고 null을 테스트하는 것은 잘못된 형식입니다.
JasonMArcher 2010

@JasonMArcher : 마지막 발언에 절대적으로 동의합니다. 하지만 실제로 데모 예제에서 무엇을 작성하길 기대하십니까? 게다가 시나리오에 따라이 코드도 괜찮을 수 있습니다.
Roman Kuzmin

기본적으로 $ ie를 사용하는 모든 코드를 try {} 안에 넣으십시오. 이렇게하면 예외가있는 경우 건너 뜁니다.
JasonMArcher 2010

2
그러면 $ null을 확인해야하는 경우를 보여주는 코드가 아닙니다.
Roman Kuzmin

11

이 모든 답변이 강조하지 않는 것은 값을 $ null과 비교할 때 $ null을 왼쪽에 두어야한다는 것입니다. 그렇지 않으면 컬렉션 유형 값과 비교할 때 문제가 발생할 수 있습니다. 참조 : https://github.com/nightroman/PowerShellTraps/blob/master/Basic/Comparison-operators-with-collections/looks-like-object-is-null.ps1

$value = @(1, $null, 2, $null)
if ($value -eq $null) {
    Write-Host "$value is $null"
}

위의 블록은 (불행히도) 실행됩니다. 더 흥미로운 점은 Powershell에서 $ value가 $ null이 아닌 $ null 일 수 있다는 것입니다.

$value = @(1, $null, 2, $null)
if (($value -eq $null) -and ($value -ne $null)) {
    Write-Host "$value is both $null and not $null"
}

따라서 이러한 비교가 컬렉션과 함께 작동하도록하려면 왼쪽에 $ null을 배치하는 것이 중요합니다.

$value = @(1, $null, 2, $null)
if (($null -eq $value) -and ($null -ne $value)) {
    Write-Host "$value is both $null and not $null"
}

나는 이것이 다시 Powershell의 힘을 보여주는 것 같아요!



1

-is 연산자를 사용한 유형 검사는 null 값에 대해 false를 반환합니다. 대부분의 경우 모두는 아니지만 $ value -is [System.Object]는 null이 아닌 값에 대해 true가됩니다. (모든 경우에 null 값에 대해 false가됩니다.)

내 가치는 물건이 아니라면 아무것도 아닙니다.


1
심지어 $value -is [__ComObject]
Dave_J


0

당신이 저와 같고 PowerShell 변수가 존재하지 않는 특정 유형인지 알 수있는 방법을 찾으려고 여기에 착륙 한 경우를 대비하십시오.

기본 RCW에서 분리 된 COM 개체는 사용할 수 없습니다.

그런 다음 나를 위해 일한 몇 가지 코드가 있습니다.

function Count-RCW([__ComObject]$ComObj){
   try{$iuk = [System.Runtime.InteropServices.Marshal]::GetIUnknownForObject($ComObj)}
   catch{return 0}
   return [System.Runtime.InteropServices.Marshal]::Release($iuk)-1
}

사용 예 :

if((Count-RCW $ExcelApp) -gt 0){[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($ExcelApp)}

다른 사람들의 더 나은 답변을 모아서 :

기타 알아 두어야 할 멋진 사항 :

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