PowerShellオブジェクトが存在するかどうかを確認する最良の方法は?


90

Comオブジェクトが存在するかどうかを確認する最良の方法を探しています。

ここに私が持っているコードがあります。最後の行を改善したいと思います:

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

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

回答:


114

私はに固執するだろう$null以外の値以降のチェック''、(空の文字列)0$falseおよび$nullチェックを通過します:if ($ie) {...}


1
if($ val){...}をブール値に使用する方が良い他のすべてのチェックはif($ val -ne $ null){..}でテストする必要があります。TY @キースヒル
イリヤ

65

あなたもすることができます

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を返す方法はわかりません。また、例外を無視してnullをテストするのは不適切な形式です。
JasonMArcher、2010

@JasonMArcher:私は最後の発言に完全に同意します。しかし、実際には、デモの例では何を書いてくれると思いますか?さらに、シナリオによっては、このコードでも問題ない場合があります。
ローマクズミン

基本的に、$ ieを使用するすべてのコードをtry {}内に配置します。そうすれば、例外がある場合にスキップされます。
JasonMArcher、2010

2
次に、$ nullを確認する必要がある場合のコードを示しません。
ローマクズミン

10

これらすべての回答で強調されていないのは、値を$ 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の力を再び示していると思います!


左側に置くことの重要な詳細が含まれているので、この回答は驚くべきことではありません$null
sonyisda1

1

-is演算子を使用した型チェックは、null値に対してfalseを返します。すべてではないにしても、ほとんどの場合、$ value -is [System.Object]は、考えられるnull以外の値に対してtrueになります。(すべての場合で、null値の場合はfalseになります。)

私の価値観は、オブジェクトでなければ、何もありません。


1
または $value -is [__ComObject]
Dave_J 2015


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.