次の行を使用して新しいイベントログを作成しています
new-eventlog -LogName "Visual Studio Builds" -Source "Visual Studio"
新しいコンピューターからビルドを実行する場合、イベントログを表示したいので、毎回これを実行します。
問題は、ログが既に作成された後にスクリプトが実行されるたびに、エラーがスローされることです。
New-EventLog : The "Visual Studio" source is already registered on the "localhost" computer.
At E:\Projects\MyApp\bootstrap.ps1:14 char:13
+ new-eventlog <<<< -LogName "Visual Studio Builds" -Source "Visual Studio"
+ CategoryInfo : InvalidOperation: (:) [New-EventLog], InvalidOperationException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.NewEventLogCommand
これで、イベントログを「検索」できることがわかりました。
Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"}
しかし、今、それが存在するかどうかをどのように判断しますか?
だから私はGet-EventLog
で正しい道にいた。
ただ読むのではなく、変数に保存しました。次に、変数がnull
かどうかを確認しました。
これは私がやろうとしていたことを達成しました。
$logFileExists = Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"}
if (! $logFileExists) {
New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}
# Check if Log exists
# Ref: http://msdn.Microsoft.com/en-us/library/system.diagnostics.eventlog.exists(v=vs.110).aspx
[System.Diagnostics.EventLog]::Exists('Application');
# Ref: http://msdn.Microsoft.com/en-us/library/system.diagnostics.eventlog.sourceexists(v=vs.110).aspx
# Check if Source exists
[System.Diagnostics.EventLog]::SourceExists("YourLogSource");
if ([System.Diagnostics.EventLog]::SourceExists("Visual Studio") -eq $False) { New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio" }
Exists
メソッドを確認します。
[System.Diagnostics.EventLog]::Exists('Visual Studio Builds')
単に存在するかどうかを確認するには:
$EventLogName = "LogName"
if ( !($(Get-EventLog -List).Log.Contains($EventLogName)))
{}
ただし、新しいものを作成するには、「管理者として」権限が必要です。これを解決するために、サブプロセスを呼び出しました。
Start-Process -verb runAs powershell.exe -ArgumentList "-file $PSScriptRoot\CreateLog.ps1" -wait
単純なCreateLog.ps1を使用する場合:
New-EventLog -LogName ScriptCheck -Source ScriptCheck
Write-EventLog –LogName ScriptCheck `
–Source ScriptCheck –EntryType Information –EventID 100 `
–Message "Start logging!"
以下のアプローチは、where
を使用してフィルターのワークロードを削減できると思います
try
{
Get-EventLog -LogName "Visual Studio Builds" -ErrorAction Ignore| Out-Null
}
catch {
New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}
それほど複雑ではない:
if (!(Get-Eventlog -LogName "Application" -Source "YourLog")){
New-Eventlog -LogName "Application" -Source "YourLog"
}
$SourceExists = [System.Diagnostics.Eventlog]::SourceExists("XYZ")
if($SourceExists -eq $false){
[System.Diagnostics.EventLog]::CreateEventSource("XYZ", "Application")
}
これを行うだけでは十分ではありません。イベントソースを作成したにもかかわらず、$SourceExists
は常にfalse
になります。 CreateEventSource
を実行してからRemove-EventLog
、および削除に失敗しました。イベントソースを作成したら、何かを書き込む必要があります。 CreateEventSource
を実行した後にこれを追加します。
Write-EventLog -LogName "Application" -Source "XYZ" -EventID 0 -EntryType Information -Message "XYZ source has been created."
https://stackoverflow.com/users/361842/johnlbevan に感謝します(コメントで)。