我正在寻找检查Com对象是否存在的最佳方法。
这是我的代码;我想改进最后一行:
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true
$ie -ne $null #Are there better options?
答案 0 :(得分:99)
我会坚持$null
检查,因为''
(空字符串),0
,$false
和$null
以外的任何值都会通过检查:if ($ie) {...}
。
答案 1 :(得分:56)
您也可以
if ($ie) {
# Do Something if $ie is not null
}
答案 2 :(得分:15)
在您的特定示例中,或许您不必执行任何检查。可能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) {
...
}
答案 3 :(得分:3)
所有这些答案都没有强调的是,在将值与$ 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中,$ 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的力量!
答案 4 :(得分:1)
使用-is运算符进行类型检查会为任何空值返回false。 在大多数情况下,如果不是全部,$ value -is [System.Object]对于任何可能的非null值都将为true。 (在所有情况下,任何空值都将为false。)
如果不是对象,我的价值就不算什么。
答案 5 :(得分:0)
我遇到了同样的问题。这个解决方案适合我。
index.php
答案 6 :(得分:0)
包括你,你就像我一样,你来到这里试图找到一种方法来判断你的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)}
从其他人的更好的答案中捣碎:
以及其他一些很酷的事情: