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:
- RCW y recuento de referencias cuando se utiliza interoperabilidad COM en C #
- Reglas de conteo de referencias de RCW! = Reglas de conteo de referencias de COM
- "El objeto COM que se ha separado de su RCW subyacente no se puede usar" con .NET 4.0
y algunas otras cosas interesantes que debes saber:
- El objeto COM que se ha separado de su RCW subyacente no se puede usar
- Marshaling personalizado
- Interoperabilidad COM avanzada
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
}
Yo tuve el mismo problema. Esta solución funciona para mí.
$Word = $null
$Word = [System.Runtime.InteropServices.Marshal]::GetActiveObject(''word.application'')
if ($Word -eq $null)
{
$Word = new-object -ComObject word.application
}