Ich verwende die folgende Zeile, um ein neues Ereignisprotokoll zu erstellen
new-eventlog -LogName "Visual Studio Builds" -Source "Visual Studio"
Ich möchte dies jedes Mal ausführen, denn wenn ich einen Build von einem neuen Computer aus ausführen möchte, würde ich trotzdem die Ereignisprotokolle sehen.
Das Problem ist, dass jedes Mal, wenn das Skript ausgeführt wird, nachdem das Protokoll bereits erstellt wurde, ein Fehler ausgegeben wird.
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
Jetzt weiß ich, dass ich nach dem Ereignisprotokoll suchen kann
Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"}
Aber wie kann ich jetzt feststellen, ob es existiert?
Also war ich mit Get-EventLog
auf dem richtigen Weg.
Anstatt es nur zu lesen, habe ich es in einer Variablen gespeichert. Dann habe ich überprüft, ob die Variable null
war.
Das hat erreicht, was ich wollte.
$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");
Überprüfen Sie die Exists
-Methode:
[System.Diagnostics.EventLog]::Exists('Visual Studio Builds')
if ([System.Diagnostics.EventLog]::SourceExists("Visual Studio") -eq $False) {
New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}
Um einfach zu prüfen, ob es existiert:
$EventLogName = "LogName"
if ( !($(Get-EventLog -List).Log.Contains($EventLogName)))
{}
Um das neue zu erstellen, benötigen Sie jedoch das Privileg "Als Administrator". Um dieses Problem zu lösen, rief ich einen Unterprozess an:
Start-Process -verb runAs powershell.exe -ArgumentList "-file $PSScriptRoot\CreateLog.ps1" -wait
Mit einfachen CreateLog.ps1:
New-EventLog -LogName ScriptCheck -Source ScriptCheck
Write-EventLog –LogName ScriptCheck `
–Source ScriptCheck –EntryType Information –EventID 100 `
–Message "Start logging!"
Ich denke, der folgende Ansatz könnte die Arbeitslast des Filters mit where
reduzieren.
try
{
Get-EventLog -LogName "Visual Studio Builds" -ErrorAction Ignore| Out-Null
}
catch {
New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}
Weniger komplex:
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")
}
Dies zu tun reicht nicht aus. Auch wenn Sie die Ereignisquelle erstellt haben, ist $SourceExists
immer false
. Ich habe es auch getestet, indem ich CreateEventSource
und dann Remove-EventLog
ausgeführt habe und das Entfernen fehlgeschlagen ist. Nachdem Sie eine Ereignisquelle erstellt haben, müssen Sie etwas dazu schreiben. Hängen Sie dies an, nachdem Sie CreateEventSource
ausgeführt haben.
Write-EventLog -LogName "Application" -Source "XYZ" -EventID 0 -EntryType Information -Message "XYZ source has been created."
Vielen Dank an https://stackoverflow.com/users/361842/johnlbevan , um dies herauszufinden (in den Kommentaren).