web-dev-qa-db-fra.com

Meilleur moyen de vérifier si un objet PowerShell existe?

Je cherche le meilleur moyen 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?
81
LaPhi

Je resterais avec le chèque $null Puisque toute valeur autre que '' (Chaîne vide), 0, $false Et $null Passera le contrôle: if ($ie) {...}.

100
Keith Hill

Vous pouvez aussi faire

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

Dans votre exemple particulier peut-être vous n'avez aucune vérification à effectuer. Est-ce possible que New-Object retourne null? Je n'ai jamais vu ça. La commande doit échouer en cas de problème et le reste du code de l'exemple ne sera pas exécuté. Alors, pourquoi devrions-nous faire cette vérification du tout?

Quelques contrôles seulement sont nécessaires dans le code ci-dessous (la comparaison explicite avec $ null est la meilleure):

# 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

Ce que toutes ces réponses ne mettent pas en évidence, c'est que lorsqu'on compare une valeur à $ null, il faut mettre $ null à gauche, sinon vous risquez d'avoir des problèmes lorsque vous comparez 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

$value = @(1, $null, 2, $null)
if ($value -eq $null) {
    Write-Host "$value is $null"
}

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:

$value = @(1, $null, 2, $null)
if (($value -eq $null) -and ($value -ne $null)) {
    Write-Host "$value is both $null and not $null"
}

Il est donc important de placer $ null à gauche pour que ces comparaisons fonctionnent avec des collections:

$value = @(1, $null, 2, $null)
if (($null -eq $value) -and ($null -ne $value)) {
    Write-Host "$value is both $null and not $null"
}

Je suppose que cela montre encore une fois le pouvoir de Powershell!

4
Dag Wieers

La vérification de type avec l'opérateur -is renvoie false pour toute valeur null. Dans la plupart des cas, sinon tous, $ value -is [System.Object] sera vrai pour toute valeur non nulle possible. (Dans tous les cas, ce sera faux pour toute valeur nulle.)

Ma valeur n'est rien si ce n'est un objet.

1
Aron

J'ai eu le même problème. Cette solution fonctionne pour moi.

$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

Dans ce cas, vous êtes comme moi et vous avez atterri ici en essayant de trouver un moyen de savoir si votre variable PowerShell a cette saveur particulière de non-existant:

L'objet COM qui a été séparé de son RCW sous-jacent ne peut pas être utilisé.

Ensuite, voici un code qui a fonctionné pour moi:

function Count-RCW([__ComObject]$ComObj){
   try{$iuk = [System.Runtime.InteropServices.Marshal]::GetIUnknownForObject($ComObj)}
   catch{return 0}
   return [System.Runtime.InteropServices.Marshal]::Release($iuk)-1
}

exemple d'utilisation:

if((Count-RCW $ExcelApp) -gt 0){[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($ExcelApp)}

en purée à partir des meilleures réponses des autres peuples:

et quelques autres choses intéressantes à savoir:

0
Gregor y