【问题标题】:Error Handling Issue with Try/Catch in PowershellPowershell 中 Try/Catch 的错误处理问题
【发布时间】:2014-01-01 21:59:24
【问题描述】:

作为我个人发展的一部分,我一直在研究 Don Jones 的一本 powershell 书籍中的以下示例,并且在让 try/catch 构造正常工作时遇到了一些严重的问题。如您所见,当catch 块执行时,它将一个名为$everything_ok 的变量设置为$false - 这应该会触发以下代码中的else 块。它的作用 - 根据我的期望附加日志文件。

但是,它不会阻止脚本 ALSO 执行 if 块中的代码,并在尝试查询制造的机器“NOTONLINE”时喷出“RPC 服务器不可用”错误(异常类型为 @ 987654326@).

让这个更奇怪的是,我通过断点检查了脚本,一路检查了$everything_ok 变量的内容,并且它在任何时候都没有包含错误的值。那么,当我指定的条件(if ($everything_ok = $true))未得到满足时,为什么if 块仍在为“NOTONLINE”执行?

我在这里做错了吗?

function get-systeminfo {
    <#
    .SYNOPSIS
    Retrieves Key Information on 1-10 Computers
    #>
    [cmdletbinding()]
    param (
        [parameter(mandatory=$true,valuefrompipeline=$true,valuefrompipelinebypropertyname=$true,helpmessage="computer name or ip address")]
        [validatecount(1,10)]
        [validatenotnullorempty()]
        [alias('hostname')]
        [string[]]$computername,
        [string]$errorlog = "C:\retry.txt",
        [switch]$logerrors
    )
    BEGIN {
        write-verbose "Error log will be $errorlog"
        }
    PROCESS {

        foreach ($computer in $computername) {
            try {$everything_ok = $true
                gwmi win32_operatingsystem -computername $computer -ea stop
                } catch {
                $everything_ok = $false
                write-verbose "$computer not Contactable"
                } 
            if ($everything_ok = $true) {
                write-verbose "Querying $computer"
                $os = gwmi win32_operatingsystem -computername $computer
                $cs = gwmi win32_computersystem -computername $computer
                $bios = gwmi win32_bios -computername $computer
                $props = @{'ComputerName' = $cs.__SERVER;
                        'OSVersion' = $os.version;
                        'SPVersion' = $os.servicepackmajorversion;
                        'BiosSerial' = $bios.serialnumber;
                        'Manufacturer' = $cs.manufacturer;
                        'Model' = $cs.model}
                write-verbose "WMI Queries Complete"
                $obj = new-object -type psobject -property $props
                write-output $obj
            }
            elseif ($everything_ok = $false) {
                if ($logerrors) {
                        "$computer $_" | out-file $errorlog -append
                        }
                }
        }
    }
    END {}
}

get-systeminfo -host localhost, NOTONLINE -verbose -logerrors

【问题讨论】:

    标签: powershell error-handling try-catch


    【解决方案1】:

    Powershell 中的等号用作赋值操作。 -eq 用于测试是否相等。因此,您的 if 语句将 $true 分配给 $everything_ok,然后测试为 true。

    【讨论】:

    • 不错,谢谢!事实证明,在这种情况下,我也可以完全不使用赋值运算符,因为它是一个布尔值。知道这会很简单......
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多