Comオブジェクトが存在するかどうかを確認する最良の方法を探しています。
これが私が持っているコードです。最後の行を改善したい:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
$null
(空の文字列)、''
、0
、および$false
以外の値はチェックに合格するので、$null
チェックに固執します:if ($ie) {...}
。
あなたもできる
if ($ie) {
# Do Something if $ie is not null
}
特定の例では、おそらくチェックを実行する必要はまったくありませんです。 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のパワーを再び示していると思います!
-is演算子を使用した型チェックは、null値に対してfalseを返します。ほとんどの場合、すべてではないにしても、$ value -is [System.Object]はnull以外の可能性のある値に対してtrueになります。 (すべての場合、null値に対してfalseになります。)
私の価値は、オブジェクトでなければ何でもありません。
私は同じ問題を抱えていました。この解決策は私にとっては有効です。
$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)}
他の人々のより良い答えからマッシュアップ:
知っておくべきその他のクールなもの: