utiles sirve sintaxis scripts script que principales para instrucciones ejemplos comandos powershell object null powershell-v2.0

sirve - ¿La mejor manera de verificar si existe un objeto PowerShell?



sintaxis powershell (7)

En caso de que usted sea como yo y haya aterrizado aquí tratando de encontrar una manera de saber si su variable PowerShell es este sabor particular de inexistente:

El objeto COM que se ha separado de su RCW subyacente no se puede usar.

Entonces aquí hay un código que funcionó para mí:

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

uso de ejemplo:

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

mezclados de las mejores respuestas de otras personas:

y algunas otras cosas interesantes que debes saber:

Estoy buscando la mejor manera de verificar si existe un Com Object.

Aquí está el código que tengo; Me gustaría mejorar la última línea:

$ie = New-Object -ComObject InternetExplorer.Application $ie.Navigate("http://www.stackoverflow.com") $ie.Visible = $true $ie -ne $null #Are there better options?


En su ejemplo particular, tal vez no tenga que realizar ningún control en absoluto . ¿Es posible que New-Object devuelva nulo? Nunca he visto eso. El comando debería fallar en caso de un problema y el resto del código en el ejemplo no se ejecutará. Entonces, ¿por qué deberíamos hacer eso en absoluto?

Solo en el código siguiente, necesitamos algunos controles (la mejor comparación es la comparación explícita con $ 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) { ... }


La comprobación de tipo con el operador -is devuelve falso para cualquier valor nulo. En la mayoría de los casos, si no todo, $ value -is [System.Object] será verdadero para cualquier posible valor no nulo. (En todos los casos, será falso para cualquier valor nulo).

Mi valor no es nada sino un objeto.


Lo que todas estas respuestas no destacan es que al comparar un valor de $ null, debe poner $ null en el lado izquierdo, de lo contrario, puede tener problemas al comparar con un valor de tipo colección. Ver: 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" }

El bloque anterior es (desafortunadamente) ejecutado. Lo que es aún más interesante es que en Powershell un valor $ puede ser $ null y no $ null:

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

Por lo tanto, es importante poner $ null en el lado izquierdo para que estas comparaciones funcionen con las colecciones:

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

¡Supongo que esto muestra una vez más el poder de Powershell!


Me quedaría con el cheque $null ya que cualquier valor que no sea '''' (cadena vacía), 0 , $false y $null pasará el cheque: if ($ie) {...} .


También puedes hacer

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