Я ищу лучший способ проверить, существует ли Com-объект.
Вот код, который у меня есть; Я бы хотел улучшить последнюю строчку:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
Вы также можете сделать
if ($ie) { # Do Something if $ie is not null }
источник
if (-not $ie) { # Do something if $ie doesn't exist/is falsey }
В вашем конкретном примере, возможно, вам вообще не нужно выполнять какие-либо проверки . Возможно ли, что
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) { ... }
источник
Все эти ответы не подчеркивают, что при сравнении значения с $ 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!
источник
$null
левую частьПроверка типа с оператором -is возвращает false для любого значения NULL. В большинстве случаев, если не во всех, $ value -is [System.Object] будет истинным для любого возможного ненулевого значения. (Во всех случаях он будет ложным для любого нулевого значения.)
Моя ценность ничто, если не объект.
источник
$value -is [__ComObject]
У меня такая же проблема. Это решение мне подходит.
$Word = $null $Word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('word.application') if ($Word -eq $null) { $Word = new-object -ComObject word.application }
https://msdn.microsoft.com/de-de/library/system.runtime.interopservices.marshal.getactiveobject(v=vs.110).aspx
источник
Если вы похожи на меня, и вы приземлились здесь, пытаясь найти способ определить, является ли ваша переменная PowerShell этим конкретным вариантом несуществующего:
Тогда вот код, который у меня сработал:
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)}
собраны вместе из лучших ответов других людей:
и еще кое-что интересное:
источник