我正在尝试将离线计算机记录在文本文件中,以便我以后再次运行它们。似乎没有记录或陷入捕获。
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 }}}
答案 0 :(得分:3)
try
用于catch
例外。您正在使用-Quiet
切换,因此Test-Connection
会返回$true
或$false
,并且在连接失败时不会throw
出现异常。
只是做:
if (Test-Connection -computername $computer -Quiet -Count 1) {
# succeeded do stuff
} else {
# failed, log or whatever
}
答案 1 :(得分:0)
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)的所有内容。通读这些书为我的功能开发工作指明了新的方向。