Ich suche nach dem besten Weg, um zu überprüfen, ob ein Com-Objekt existiert.
Hier ist der Code, den ich habe; Ich möchte die letzte Zeile verbessern:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
Ich würde bei der $null
- Prüfung bleiben, da alle anderen Werte als ''
(Leere Zeichenfolge), 0
, $false
Und $null
Übergeben werden die Prüfung: if ($ie) {...}
.
Sie können auch tun
if ($ie) {
# Do Something if $ie is not null
}
In Ihrem speziellen Beispiel vielleicht Sie müssen überhaupt keine Prüfungen durchführen. Ist das möglich, dass New-Object
return null? Ich habe das noch nie gesehen. Der Befehl sollte im Falle eines Problems fehlschlagen und der Rest des Codes im Beispiel wird nicht ausgeführt. Warum sollten wir das überhaupt überprüfen?
Nur im folgenden Code müssen einige Prüfungen durchgeführt werden (am besten ist ein expliziter Vergleich mit $ 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) {
...
}
Was alle diese Antworten nicht hervorheben, ist, dass Sie beim Vergleich eines Werts mit $ null $ null auf der linken Seite einfügen müssen, da Sie sonst möglicherweise Probleme beim Vergleich mit einem Wert vom Typ "Auflistung" bekommen. Siehe: 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"
}
Der obige Block wird (leider) ausgeführt. Noch interessanter ist, dass in Powershell ein $ -Wert sowohl $ null als auch nicht $ null sein kann:
$value = @(1, $null, 2, $null)
if (($value -eq $null) -and ($value -ne $null)) {
Write-Host "$value is both $null and not $null"
}
Daher ist es wichtig, $ null auf die linke Seite zu setzen, damit diese Vergleiche mit Sammlungen funktionieren:
$value = @(1, $null, 2, $null)
if (($null -eq $value) -and ($null -ne $value)) {
Write-Host "$value is both $null and not $null"
}
Ich denke, das zeigt wieder einmal die Kraft von Powershell!
Die Typprüfung mit dem Operator -is gibt für jeden Nullwert false zurück. In den meisten Fällen, wenn nicht allen, ist $ value -is [System.Object] für jeden möglichen Nicht-Null-Wert wahr. (In allen Fällen ist es für jeden Nullwert falsch.)
Mein Wert ist nichts, wenn kein Objekt.
Ich hatte das gleiche problem Diese Lösung funktioniert bei mir.
$Word = $null
$Word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Word.application')
if ($Word -eq $null)
{
$Word = new-object -ComObject Word.application
}
Wenn Sie wie ich sind und hier gelandet sind, um herauszufinden, ob es sich bei Ihrer PowerShell-Variablen um eine bestimmte nicht vorhandene Variante handelt:
COM-Objekt, das von seinem zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden.
Dann ist hier ein Code, der für mich funktioniert hat:
function Count-RCW([__ComObject]$ComObj){
try{$iuk = [System.Runtime.InteropServices.Marshal]::GetIUnknownForObject($ComObj)}
catch{return 0}
return [System.Runtime.InteropServices.Marshal]::Release($iuk)-1
}
beispielverwendung:
if((Count-RCW $ExcelApp) -gt 0){[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($ExcelApp)}
zusammengestellt aus den besseren Antworten anderer Völker:
und einige andere coole Dinge zu wissen: