带测试连接的 Powershell try/catch
Powershell try/catch with test-connection
我正在尝试将离线计算机记录在一个文本文件中,以便稍后我可以再次 运行 它们。它似乎没有被记录或被捕获。
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 }}}
try
用于 catch
ing 异常。您正在使用 -Quiet
开关,因此 Test-Connection
returns $true
或 $false
,并且当连接失败时 throw
不会出现异常。
作为替代方案,您可以这样做:
if (Test-Connection -computername $computer -Quiet -Count 1) {
# succeeded do stuff
} else {
# failed, log or whatever
}
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)的所有内容。阅读这些书籍为我的函数开发工作提供了新的方向。
我正在尝试将离线计算机记录在一个文本文件中,以便稍后我可以再次 运行 它们。它似乎没有被记录或被捕获。
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 }}}
try
用于 catch
ing 异常。您正在使用 -Quiet
开关,因此 Test-Connection
returns $true
或 $false
,并且当连接失败时 throw
不会出现异常。
作为替代方案,您可以这样做:
if (Test-Connection -computername $computer -Quiet -Count 1) {
# succeeded do stuff
} else {
# failed, log or whatever
}
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)的所有内容。阅读这些书籍为我的函数开发工作提供了新的方向。