我正在寻找检查Com对象是否存在的最佳方法。
这是我的代码;我想改进最后一行:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
Answers:
在您的特定示例中,也许您根本不必执行任何检查。有可能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放在左侧,否则在与collection-type值进行比较时可能会遇到麻烦。参见: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中,$ 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的强大功能!
$null
使用-is运算符进行类型检查,对于任何空值都将返回false。在大多数情况下,如果不是全部,则对于任何可能的非null值,$ value -is [System.Object]将为true。(在所有情况下,任何空值都将为false。)
如果不是对象,我的价值就是什么。
$value -is [__ComObject]
我有同样的问题。此解决方案对我有用。
$Word = $null
$Word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('word.application')
if ($Word -eq $null)
{
$Word = new-object -ComObject word.application
}
如果您像我一样,并且在这里着陆,试图找到一种方法来判断您的PowerShell变量是否是这种不存在的特殊形式:
与它的基础RCW分开的COM对象不能使用。
然后这是一些对我有用的代码:
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)}
从其他人的更好答案中混在一起:
和其他一些有趣的事情: