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?
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) {...}
.
Vous pouvez aussi faire
if ($ie) {
# Do Something if $ie is not null
}
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) {
...
}
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!
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.
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
}
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: