Je recherche la meilleure façon de vérifier si un objet Com existe.
Voici le code que j'ai; J'aimerais améliorer la dernière ligne:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
Vous pouvez aussi faire
la source
if (-not $ie) { # Do something if $ie doesn't exist/is falsey }
Dans votre exemple particulier, vous n'avez peut-être aucun contrôle à effectuer . Est-ce possible que
New-Object
retourne null? Je n'ai jamais vu ça. La commande devrait échouer en cas de problème et le reste du code de l'exemple ne sera pas exécuté. Alors pourquoi devrions-nous faire ces vérifications?Seulement dans le code comme ci-dessous, nous avons besoin de quelques vérifications (la comparaison explicite avec $ null est la meilleure):
la source
Ce que toutes ces réponses ne mettent pas en évidence, c'est que lorsque vous comparez une valeur à $ null, vous devez mettre $ null sur le côté gauche, sinon vous risquez d'avoir des problèmes lors de la comparaison avec une valeur de type collection. Voir: https://github.com/nightroman/PowerShellTraps/blob/master/Basic/Comparison-operators-with-collections/looks-like-object-is-null.ps1
Le bloc ci-dessus est (malheureusement) exécuté. Ce qui est encore plus intéressant, c'est que dans Powershell, une valeur $ peut être à la fois $ null et non $ null:
Il est donc important de mettre $ null sur le côté gauche pour que ces comparaisons fonctionnent avec les collections:
Je suppose que cela montre encore une fois la puissance de Powershell!
la source
$null
sur le côté gaucheLa vérification de type avec l'opérateur -is renvoie false pour toute valeur nulle. Dans la plupart des cas, sinon tous, $ value -is [System.Object] sera vrai pour toute valeur non nulle possible. (Dans tous les cas, il sera faux pour toute valeur nulle.)
Ma valeur n'est rien sinon un objet.
la source
$value -is [__ComObject]
J'ai eu le même problème. Cette solution fonctionne pour moi.
https://msdn.microsoft.com/de-de/library/system.runtime.interopservices.marshal.getactiveobject(v=vs.110).aspx
la source
Au cas où vous êtes comme moi et vous avez atterri ici en essayant de trouver un moyen de savoir si votre variable PowerShell est cette saveur particulière d'inexistant:
Ensuite, voici un code qui a fonctionné pour moi:
exemple d'utilisation:
écrasés à partir des meilleures réponses des autres:
et quelques autres choses intéressantes à savoir:
la source