【问题标题】:PowerShell SMO Error Handling Empty or NullPowerShell SMO 错误处理空或 Null
【发布时间】:2025-12-06 00:35:02
【问题描述】:

我有一个使用 SMO 获取 SQL Server 属性的脚本。我让脚本在 html 中显示属性,但我无法设置它,因此即使 SMO 对象由于连接或其他错误而返回空,脚本仍会进入数据行。如果 SMO 对象返回空或 null,我将如何让它在数据行中输入字符串?

我已经尝试过 if 语句 where $serverObject -eq $null 并且没有打印出来。

foreach($instance in $instanceList)
{        
    $serverObject = New-Object Microsoft.SqlServer.Management.Smo.Server($instance)

    $instance = $instance.toupper()

    $serverName = $serverObject.ComputerNamePhysicalNetBIOS;
    $instanceName = $serverObject.InstanceName;
    $versionBuild = $serverObject.Information.ResourceVersion;
    $servicePack = $serverObject.Information.ProductLevel;

    $color = $redColor;

    if($serverName -eq $null -and $instanceName -eq $null)
    {
        [string]$serverName = "Error Connecting"
        $instanceName = $instance
    }
        else
        {
            if($instanceName -eq $null -and $versionBuild -eq $null)
            {
                [string]$instanceName = $instance
                [string]$versionBuild = "Error"
            }
        }
    }

    # Set background color to green if service pack is 2008r2 SP2
    if($versionBuild -match $vs2008r2sp2)
    {
        $color = $greenColor
    }          
    else
    {    
        # Set background color to yellow if service pack is 2008 SP3
        if($versionBuild -match $vs2008sp3)
        {
                $color = $yellowColor
        }
        else
        {
            # Set background color to orange if service pack is 2005 SP4
            if($versionBuild -match $vs2005sp4)
            {
                $color = $orangeColor   
            }
        }
    }

    # Create table data rows 
    $dataRow = "
    <tr>
        <td width='10%'>$serverName</td>
        <td width='15%'>$instanceName</td>                        
        <td width='5%' bgcolor=`'$color`' align='center'>$versionBuild</td>
        <td width='10%' align='center'>$servicePack</td>
    </tr>
    "

    # If statement needed to remove label that were null
    If ($versionBuild -ne 'NaN') 
    {
        Add-Content $servicePackReport $dataRow;
        Write-Host -ForegroundColor DarkYellow "$serverName $instanceName service pack build = $versionBuild";
        $i++        
    }
}

【问题讨论】:

    标签: sql sql-server powershell foreach smo


    【解决方案1】:

    您遇到了麻烦,因为您尝试检查实例是否存在。您进行检查,但随后将变量设置为“错误”。这会导致问题,因为稍后您想检查$versionBuild 作为您的评估实例是否有效。这就是错误所在。您正在评估:

    If ($versionBuild -ne 'NaN')
    

    问题是如果它不等于 string "NaN",您正在比较。如果$versionBuild$null(即当实例不存在时),则不等于“NaN”,因此写入该行。要修复它,请将其更改为:

    If ($versionBuild -ne $null)
    

    但除此之外,您可以简化一些事情,并通过先检查实例是否存在来稍微提高速度。如果是这样,那么您将提取所有其余信息并创建您的数据行。

    如果它不存在,那么你只是让它吐出一条错误消息。

    foreach($instance in $instanceList)
    {        
        $serverObject = New-Object Microsoft.SqlServer.Management.Smo.Server($instance)
    
        $instance = $instance.toupper()
    
        $serverName = $serverObject.ComputerNamePhysicalNetBIOS;
    
        #Check to see if the instance exists
        if($serverName -ne $null)
        {
            #The instance Exists, get the rest of the properties
            $instanceName = $serverObject.InstanceName;
            $versionBuild = $serverObject.Information.ResourceVersion;
            $servicePack = $serverObject.Information.ProductLevel;
    
            $color = $redColor;
            # Set background color to green if service pack is 2008r2 SP2
            if($versionBuild -match $vs2008r2sp2)
            {
            $color = $greenColor
            }          
            else
            {    
            # Set background color to yellow if service pack is 2008 SP3
            if($versionBuild -match $vs2008sp3)
            {
                $color = $yellowColor
            }
            else
            {
                # Set background color to orange if service pack is 2005 SP4
                if($versionBuild -match $vs2005sp4)
                {
                $color = $orangeColor   
                }
            }
            }
    
            # Create table data rows 
            $dataRow = "
            <tr>
            <td width='10%'>$serverName</td>
            <td width='15%'>$instanceName</td>                        
            <td width='5%' bgcolor=`'$color`' align='center'>$versionBuild</td>
            <td width='10%' align='center'>$servicePack</td>
            </tr>
            "
    
            Add-Content $servicePackReport $dataRow;
            Write-Host -ForegroundColor DarkYellow "$serverName $instanceName service pack build = $versionBuild";
            $i++        
        }
        else
        {
           #The instance does not exist. Write error message to console
           Write-Host -ForegroundColor Red "$instance Does NOT exist";
        }
    
    }
    

    【讨论】: