Лучший способ проверить, существует ли объект PowerShell?

Я ищу лучший способ проверить, существует ли объект Com.

Вот код, который у меня есть; Я бы хотел улучшить последнюю строку:

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true

$ie -ne $null #Are there better options?

Ответ 1

Я бы придерживался проверки $null, поскольку любое значение, отличное от '' (пустая строка), 0, $false и $null будет проходить проверку: if ($ie) {...}.

Ответ 2

Вы также можете сделать

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

Ответ 3

В вашем конкретном примере, возможно, вам вообще не нужно выполнять какие-либо проверки. Возможно ли, что New-Object возвращает null? Я этого никогда не видел. Команда не работает в случае сбоя, а остальная часть кода в примере не будет выполнена. Так зачем вообще делать эти проверки?

Только в коде, как показано ниже, нам нужны некоторые проверки (явное сравнение с $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) {
    ...
}

Ответ 4

Во всех этих ответах не выделяется то, что при сравнении значения с $ null вы должны поместить $ null слева, иначе вы можете столкнуться с проблемами при сравнении со значением типа коллекции. Смотрите: 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"
}

Вышеуказанный блок выполнен (к сожалению). Что еще более интересно, в Powershell значение $ может быть как $ null, так и не $ null:

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

Поэтому важно поместить $ null слева, чтобы эти сравнения работали с коллекциями:

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

Я думаю, это еще раз показывает мощь Powershell!

Ответ 5

Проверка типа с помощью оператора -is возвращает false для любого нулевого значения. В большинстве случаев, если не все, $value -is [System.Object] будет истинным для любого возможного ненулевого значения. (Во всех случаях он будет ложным для любого нулевого значения.)

Мое значение ничего не значит, если не объект.

Ответ 7

В случае, если вы похожи на меня, вы приземлились здесь, пытаясь найти способ определить, является ли ваша переменная PowerShell этой конкретной разновидностью несуществующей:

COM-объект, который был отделен от базового RCW, не может быть использован.

Тогда вот код, который работал для меня:

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

пример использования:

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

склеенные из лучших ответов других людей:

и некоторые другие интересные вещи: