检查PowerShell对象是否存在的最佳方法是什么?

时间:2010-12-13 14:56:27

标签: powershell object null powershell-v2.0

我正在寻找检查Com对象是否存在的最佳方法。

这是我的代码;我想改进最后一行:

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true

$ie -ne $null #Are there better options?

7 个答案:

答案 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)

答案 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)}

从其他人的更好的答案中捣碎:

以及其他一些很酷的事情: