Saya mencari cara terbaik untuk memeriksa apakah Objek Com ada.
Ini kode yang saya miliki; Saya ingin meningkatkan baris terakhir:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
powershell
object
null
powershell-2.0
LaPhi
sumber
sumber
Anda juga bisa melakukannya
if ($ie) { # Do Something if $ie is not null }
sumber
if (-not $ie) { # Do something if $ie doesn't exist/is falsey }
Dalam contoh khusus Anda, mungkin Anda tidak perlu melakukan pemeriksaan sama sekali . Apakah itu mungkin
New-Object
mengembalikan nol? Saya belum pernah melihat itu. Perintah harus gagal jika terjadi masalah dan kode lainnya dalam contoh tidak akan dijalankan. Jadi mengapa kita harus melakukan pemeriksaan itu?Hanya dalam kode seperti di bawah ini kita memerlukan beberapa pemeriksaan (perbandingan eksplisit dengan $ null adalah yang terbaik):
# 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) { ... }
sumber
Apa yang tidak disoroti oleh semua jawaban ini adalah ketika membandingkan nilai dengan $ null, Anda harus meletakkan $ null di sisi kiri, jika tidak, Anda mungkin mendapat masalah saat membandingkan dengan nilai tipe-koleksi. Lihat: 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" }
Blok di atas (sayangnya) dieksekusi. Yang lebih menarik adalah bahwa di Powershell, nilai $ bisa berupa $ null dan bukan $ null:
$value = @(1, $null, 2, $null) if (($value -eq $null) -and ($value -ne $null)) { Write-Host "$value is both $null and not $null" }
Jadi, penting untuk meletakkan $ null di sisi kiri agar perbandingan ini berfungsi dengan collection:
$value = @(1, $null, 2, $null) if (($null -eq $value) -and ($null -ne $value)) { Write-Host "$value is both $null and not $null" }
Saya rasa ini menunjukkan lagi kekuatan Powershell!
sumber
$null
di sisi kiriKetik-cek dengan operator -is mengembalikan false untuk nilai null apa pun. Dalam kebanyakan kasus, jika tidak semua, $ value -is [System.Object] akan menjadi true untuk setiap kemungkinan nilai non-null. (Dalam semua kasus, ini akan menjadi salah untuk nilai null apa pun.)
Nilai saya tidak ada artinya jika bukan sebuah objek.
sumber
$value -is [__ComObject]
Saya memiliki masalah yang sama. Solusi ini berhasil untuk saya.
$Word = $null $Word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('word.application') if ($Word -eq $null) { $Word = new-object -ComObject word.application }
https://msdn.microsoft.com/de-de/library/system.runtime.interopservices.marshal.getactiveobject(v=vs.110).aspx
sumber
Jika Anda seperti saya dan Anda mendarat di sini mencoba menemukan cara untuk mengetahui apakah variabel PowerShell Anda adalah rasa khusus yang tidak ada ini:
Lalu inilah beberapa kode yang berhasil untuk saya:
function Count-RCW([__ComObject]$ComObj){ try{$iuk = [System.Runtime.InteropServices.Marshal]::GetIUnknownForObject($ComObj)} catch{return 0} return [System.Runtime.InteropServices.Marshal]::Release($iuk)-1 }
contoh penggunaan:
if((Count-RCW $ExcelApp) -gt 0){[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($ExcelApp)}
disatukan dari jawaban orang lain yang lebih baik:
dan beberapa hal keren lainnya yang perlu diketahui:
sumber