Comオブジェクトが存在するかどうかを確認する最良の方法を探しています。
ここに私が持っているコードがあります。最後の行を改善したいと思います:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
回答:
特定の例では、おそらくチェックをまったく実行する必要はありません。New-Object
null を返すことは可能ですか?私はそれを見たことがありません。問題が発生した場合、コマンドは失敗し、例の残りのコードは実行されません。では、なぜこのチェックを行う必要があるのでしょうか。
以下のようなコードでのみ、いくつかのチェックが必要です($ 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) {
...
}
これらすべての回答で強調されていないのは、値を$ 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
-is演算子を使用した型チェックは、null値に対してfalseを返します。すべてではないにしても、ほとんどの場合、$ value -is [System.Object]は、考えられるnull以外の値に対してtrueになります。(すべての場合で、null値の場合はfalseになります。)
私の価値観は、オブジェクトでなければ、何もありません。
$value -is [__ComObject]
同じ問題がありました。この解決策は私にとってはうまくいきます。
$Word = $null
$Word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('word.application')
if ($Word -eq $null)
{
$Word = new-object -ComObject word.application
}
あなたが私のようなもので、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)}
他の人々のより良い答えから一緒につぶされました:
知っておくべきその他のクールなこと: