【问题标题】:PowerShell Exception CatchingPowerShell 异常捕获
【发布时间】:2018-06-19 15:33:16
【问题描述】:

我想获取一些设备的 ip。其中一些是无法访问的。如果 PowerShell 想要获取无法访问的设备的 ip,它会终止整个脚本。我想到了捕捉异常。但我找不到任何关于如何捕捉“主机未知”的信息。我不太了解我尝试过的异常,但它当然不起作用:

` try {
    $IPClient = Test-Connection $name -Count 1
    $IPv4 = $IPClient.IPV4Address.IPAddressToString 
    } catch {
    $IPv4 = "Could not find $name"
 }`

如果 PowerShell 发现一个不可访问的设备,它会终止整个脚本。 我怎样才能抓住这一点,以便我的$name继续列表,并可能用“找不到$name的设备”或类似的东西填充变量?

【问题讨论】:

    标签: powershell exception


    【解决方案1】:

    Test-Connection 正在抛出一个“非终止”异常,catch 无法处理。要强制它成为“终止”(因此由catch 处理),请使用-ErrorAction 参数:

    try 
     {
        $IPClient = Test-Connection $name -Count 1 -ErrorAction Stop
        $IPv4 = $IPClient.IPV4Address.IPAddressToString 
     } 
     catch 
     {
        $IPv4 = "Could not find $name"
     }
    

    编辑:测试多台服务器

    要测试服务器列表,捕获任何失败的服务器,一个选项是:

    $names = "Server1","Server2","Server3"
    $ipv4 = @{}
    
    foreach($server in $names)
    {
        try 
        {
            $ipClient = Test-Connection $server -Count 1 -ErrorAction Stop
            $ipv4.Add($server, $IPClient.IPV4Address.IPAddressToString)
        }
        catch 
        {
           $ipv4.Add($server, "Unreachable")
        }
     }
    

    $ipv4 是一个哈希表,可以这样显示:

    $ipv4
    

    在表格中给出输出:

    Name       Value        
    ----       -----        
    server2    Unreachable  
    Server3    10.10.10.10
    server1    Unreachable 
    

    按名称访问任何项目:

    $ipv4.Server2
    

    【讨论】:

    • 感谢您提供 ErrorAction 参数。脚本应证明 每个 名称并返回 ipv4 或 could not find $name"。例如,如果$name 具有三个值:test1test2test3... 它应该返回 test1 127.0.0.1 test2 "Could not find test2" 和 test3 的 ip测试3等等。对不起,如果我表达得含糊不清。
    • @Uni_x。我用一种可能的方式更新了我的答案来处理所有服务器。
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2013-09-06
    • 2016-12-17
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多