オフラインのコンピューターをテキストファイルに記録して、後で再度実行できるようにしようとしています。記録されている、またはキャッチされているようには見えません。
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
は$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にパイプして、そこからドット表記でドリルインします。
ドン・ジョーンズとジェフリー・ヒックスは、DSCのような基本的なトピックから高度なトピックまですべてをカバーする素晴らしい本のセットを利用できます。これらの本を読むことで、私の機能開発の取り組みに新しい方向性が与えられました。