Ответ 1
Я бы придерживался проверки $null
, поскольку любое значение, отличное от ''
(пустая строка), 0
, $false
и $null
будет проходить проверку: if ($ie) {...}
.
Я ищу лучший способ проверить, существует ли объект Com.
Вот код, который у меня есть; Я бы хотел улучшить последнюю строку:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
Я бы придерживался проверки $null
, поскольку любое значение, отличное от ''
(пустая строка), 0
, $false
и $null
будет проходить проверку: if ($ie) {...}
.
Вы также можете сделать
if ($ie) {
# Do Something if $ie is not null
}
В вашем конкретном примере, возможно, вам вообще не нужно выполнять какие-либо проверки. Возможно ли, что 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!
Проверка типа с помощью оператора -is возвращает false для любого нулевого значения. В большинстве случаев, если не все, $value -is [System.Object] будет истинным для любого возможного ненулевого значения. (Во всех случаях он будет ложным для любого нулевого значения.)
Мое значение ничего не значит, если не объект.
У меня была та же проблема. Это решение работает для меня.
$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)}
склеенные из лучших ответов других людей:
и некоторые другие интересные вещи: