Лучший способ проверить, существует ли объект PowerShell?
Я ищу лучший способ проверить, существует ли Com-объект.
вот код, который у меня есть; я хотел бы улучшить последнюю строку:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
7 ответов:
Я бы придерживался
$nullпроверьте, так как любое значение, кроме''(пустая строка),0,$falseи$nullпройдет проверку:if ($ie) {...}.
в вашем конкретном примере, возможно вы не должны выполнять никаких проверок на всех. Возможно ли, что
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) { ... }
Type-check с помощью оператора-is возвращает false для любого нулевого значения. В большинстве случаев, если не все, $value-это [System.Object] будет true для любого возможного ненулевого значения. (Во всех случаях это будет false для любого нулевого значения.)
мое значение ничего, если не объект.
что все эти ответы не выделяют, так это то, что при сравнении значения с $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 a $value может быть как $ 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 !
У меня была такая же проблема. Это решение работает для меня.
$Word = $null $Word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('word.application') if ($Word -eq $null) { $Word = new-object -ComObject word.application }
упакуйте вы, вы похожи на меня, и вы приземлились здесь, пытаясь найти способ узнать, является ли ваша переменная 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)}пюре из лучших ответов других народов:
- RCW & подсчет ссылок при использовании com-взаимодействия в C#
- правила подсчета ссылок RCW != Правила подсчета ссылок COM
- "COM-объект, который был отделен от его базового RCW не может быть использован" с .NET 4.0
и некоторые другие интересные вещи, чтобы знать:
Comments