wake-up-neo.com

Bester Weg, um zu überprüfen, ob ein PowerShell-Objekt existiert?

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?
81
LaPhi

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) {...}.

100
Keith Hill

Sie können auch tun

if ($ie) {
    # Do Something if $ie is not null
}
57
ravikanth

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) {
    ...
}
15
Roman Kuzmin

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!

4
Dag Wieers

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.

1
Aron

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
}

https://msdn.Microsoft.com/de-de/library/system.runtime.interopservices.marshal.getactiveobject (v = vs.110) .aspx

0
McHalley

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:

0
Gregor y