Szukam najlepszego sposobu sprawdzenia, czy obiekt Com istnieje.
Oto kod, który mam; Chciałbym poprawić ostatnią linię:
$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
źródło
źródło
Ty też możesz to zrobić
if ($ie) { # Do Something if $ie is not null }
źródło
if (-not $ie) { # Do something if $ie doesn't exist/is falsey }
W twoim konkretnym przykładzie być może nie musisz w ogóle wykonywać żadnych kontroli . Czy to możliwe, że
New-Object
zwrot null? Nigdy tego nie widziałem. Polecenie powinno zakończyć się niepowodzeniem w przypadku problemu, a reszta kodu w przykładzie nie zostanie wykonana. Dlaczego więc w ogóle mielibyśmy robić to kontrole?Tylko w kodzie jak poniżej potrzebujemy pewnych sprawdzeń (najlepsze jest jawne porównanie z $ 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) { ... }
źródło
Wszystkie te odpowiedzi nie podkreślają tego, że porównując wartość z $ null, musisz umieścić $ null po lewej stronie, w przeciwnym razie możesz mieć kłopoty podczas porównywania z wartością typu kolekcji. Zobacz: 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" }
Powyższy blok jest (niestety) wykonywany. Jeszcze bardziej interesujące jest to, że w Powershell wartość $ może być równa $ null i nie $ null:
$value = @(1, $null, 2, $null) if (($value -eq $null) -and ($value -ne $null)) { Write-Host "$value is both $null and not $null" }
Dlatego ważne jest, aby umieścić $ null po lewej stronie, aby te porównania działały z kolekcjami:
$value = @(1, $null, 2, $null) if (($null -eq $value) -and ($null -ne $value)) { Write-Host "$value is both $null and not $null" }
Wydaje mi się, że to po raz kolejny pokazuje moc Powershell!
źródło
$null
po lewej stronieSprawdzanie typu z operatorem -is zwraca false dla dowolnej wartości null. W większości przypadków, jeśli nie wszystkie, $ value -is [System.Object] będzie prawdziwe dla każdej możliwej wartości innej niż null. (We wszystkich przypadkach będzie to fałsz dla każdej wartości null).
Moja wartość jest niczym, jeśli nie przedmiotem.
źródło
$value -is [__ComObject]
Miałem ten sam problem. To rozwiązanie działa u mnie.
$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
źródło
Załóżmy, że jesteś podobny do mnie i wylądowałeś tutaj, próbując znaleźć sposób, aby stwierdzić, czy twoja zmienna PowerShell ma ten szczególny smak nieistniejący:
Oto kod, który zadziałał dla mnie:
function Count-RCW([__ComObject]$ComObj){ try{$iuk = [System.Runtime.InteropServices.Marshal]::GetIUnknownForObject($ComObj)} catch{return 0} return [System.Runtime.InteropServices.Marshal]::Release($iuk)-1 }
przykład użycia:
if((Count-RCW $ExcelApp) -gt 0){[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($ExcelApp)}
zmiksowane z lepszymi odpowiedziami innych ludzi:
i kilka innych fajnych rzeczy, które warto wiedzieć:
źródło