带测试连接的Powershell try/catch

camsedfj  于 2023-03-02  发布在  Shell
关注(0)|答案(2)|浏览(121)

我正在尝试将脱机计算机记录在文本文件中,以便以后可以再次运行它们。看起来没有记录或在catch中捕获。

function Get-ComputerNameChange {

    [CmdletBinding()]
    Param(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)]
    [string[]]$computername,
    [string]$logfile = 'C:\PowerShell\offline.txt'
    )



    PROCESS {

        Foreach($computer in $computername) {
        $continue = $true
        try { Test-Connection -computername $computer -Quiet -Count 1 -ErrorAction stop
        } catch [System.Net.NetworkInformation.PingException]
        {
            $continue = $false

            $computer | Out-File $logfile
        }
        }

        if($continue){
        Get-EventLog -LogName System -ComputerName $computer | Where-Object {$_.EventID -eq 6011} | 
        select machinename, Time, EventID, Message }}}
dzhpxtsq

dzhpxtsq1#

try用于catch ing异常。您正在使用-Quiet开关,因此Test-Connection返回$true$false,并且在连接失败时不将throw作为异常。
作为替代方案,您可以:

if (Test-Connection -computername $computer -Quiet -Count 1) {
    # succeeded do stuff
} else {
    # failed, log or whatever
}
3ks5zfa0

3ks5zfa02#

Try/Catch块是更好的方法,特别是如果你计划在生产中使用脚本。OP的代码可以工作,我们只需要从Test-Connection中删除**-Quiet**参数并捕获指定的错误。我在PowerShell 5.1中的Win10上测试过,它工作得很好。

try {
        Write-Verbose "Testing that $computer is online"
        Test-Connection -ComputerName $computer -Count 1 -ErrorAction Stop | Out-Null
        # any other code steps follow
    catch [System.Net.NetworkInformation.PingException] {
        Write-Warning "The computer $(($computer).ToUpper()) could not be contacted"
    } # try/catch computer online?

我过去曾遇到过这种情况。如果你想确保在处理错误时捕捉到正确的错误,请检查$error变量中保存的错误信息。最后一个错误是$error[0],首先将其传输到Get-Member,然后从那里使用点标记进行钻取。
Don Jones和Jeffery Hicks有一套很棒的书,涵盖了从基础到像DSC这样的高级主题的一切。阅读这些书给了我函数开发工作的新方向。

相关问题