繁体   English   中英

尝试捕捉 - 如何捕捉错误但继续?

[英]Try Catch - How to Catch error but continue?

我有这个脚本,它为每台计算机循环一个 foreach 循环,并为每台计算机循环每个 NIC。 当前,Catch 块未运行。 我想要做的是捕捉错误(通常是因为 get-wmi 无法连接到机器),做一些事情(向 PSCustomObject 添加一些信息),然后继续下一次迭代。 如何在捕获错误的同时继续 foreach 循环?

    param (
        [Alias('Hostname')]
        [string[]]$ComputerName = @('pc1','pc2'),
        
        $OldDNSIP = '7.7.7.7',

        $NewDNSIP = @('9.9.9.9','8.8.8.8')
    )

    $FailedArray = @()
    $DHCPArray = @()

    Foreach ($Computer in $ComputerName){
        $NICList = Get-WmiObject Win32_NetworkAdapterConfiguration -computername $Computer | where{$_.IPEnabled -eq "TRUE"}
            Foreach($NIC in $NICList){
                If($NIC.DHCPEnabled -eq $false){

                    Try{
                        $DNSIPs = $NIC.DNSServerSearchOrder
                        if($DNSIPs -contains $OldDNSIP){
                            
                            $NewDNS = $DNSIPs | foreach {$_ -replace $OldDNSIP,$NewDNSIP[0]}
                            $null = $NIC.SetDNSServerSearchOrder($NewDNS)
                        }
                        else{
                            write-host " - Old DNS server IP not found... ignoring"
                        }


                    }
                    Catch{
                        write-host " - Something went wrong... logging to a CSV for review later" -ForegroundColor Red
                        $FailedArray += [PSCustomObject]@{
                        'Computer' = $Nic.pscomputername
                        'NIC_ID' = $nic.index
                        'NIC_Descrption' = $nic.description}
                    }

                }
                ElseIf($NIC.DHCPEnabled -eq $true){
                    write-host " - DHCP is enabled. Adding this IP, Hostname, Nic Index and DHCP Server to a CSV for reviewing."
                    #add pscomputer, nic id, refernece and dhcp server to DHCPNICArray
                    $DHCPArray += [PSCustomObject]@{
                    'Computer' = $Nic.pscomputername
                    'NIC_ID' = $nic.index
                    'NIC_Descrption' = $nic.description
                    'DHCPEnabled' =$nic.dhcpenabled
                    'DHCPServer' = $nic.dhcpserver}
                }
            }
    }


$DHCPArray | export-csv c:\temp\dhcp.csv -NoTypeInformation
$FailedArray | export-csv c:\temp\failed.csv -NoTypeInformation

如果 WMI 错误是由于连接失败引起的,它们将在处理任何网卡之前发生。 如果您想捕获它们,然后继续下一台计算机,则必须将 try-catch 移动到该循环的级别。 如果您还想捕获特定于 nic 的错误,则需要在该级别进行第二次 try-catch。

此外,请考虑使用-ErrorAction Stop参数,或指定$ErrorActionPreference = 'Stop' ,以确保所有错误都终止(这意味着直接跳转到 catch 块)。

这是一个示例,并附有注释以供解释:

$ErrorActionPreference = 'Stop'

foreach ($Computer in $ComputerName) {
    # add a try-catch per computer,
    # to catch WMI errors
    # and then continue with the next computer afterwards
    try {
        # if errors occur here,
        # execution will jump right to the catch block the bottom
        $NICList = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer -ErrorAction Stop | where {
            $_.IPEnabled -eq "TRUE"
        }
        foreach ($NIC in $NICList) {
            # add a try-catch per NIC,
            # to catch errors with this specific NIC and then
            # continue with the next nic
            try {
                if ($NIC.DHCPEnabled -eq $false){
                    $DNSIPs = $NIC.DNSServerSearchOrder
                    if ($DNSIPs -contains $OldDNSIP) {
                        $NewDNS = $DNSIPs | foreach {$_ -replace $OldDNSIP,$NewDNSIP[0]}
                        $null = $NIC.SetDNSServerSearchOrder($NewDNS)
                    }
                    else {
                        write-host " - Old DNS server IP not found... ignoring"
                    }
                }
                elseif ($NIC.DHCPEnabled -eq $true){
                    write-host " - DHCP is enabled. Adding this IP, Hostname, Nic Index and DHCP Server to a CSV for reviewing."
                    $DHCPArray += [PSCustomObject]@{
                        'Computer' = $Nic.pscomputername
                        'NIC_ID' = $nic.index
                        'NIC_Descrption' = $nic.description
                        'DHCPEnabled' =$nic.dhcpenabled
                        'DHCPServer' = $nic.dhcpserver
                    }
                }
            }
            catch {
                write-host " - Configuring a NIC went wrong... logging to a CSV for review later" -ForegroundColor Red
                # add nic-specific entry
                $FailedArray += [PSCustomObject]@{
                    'Computer' = $Nic.pscomputername
                    'NIC_ID' = $nic.index
                    'NIC_Descrption' = $nic.description
                }
            }
            # continue with next nic...
        } # foreach nic
    }
    catch {
        write-host " - Something else went wrong... logging to a CSV for review later" -ForegroundColor Red
        # add entry for current computer
        # (we don't know about nics, because wmi failed)
        $FailedArray += [PSCustomObject]@{
            'Computer' = $Computer
        }
    }
    # continue with next computer...
} # foreach computer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM