39

次の行を使用して、新しいイベントログを作成しています

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"} 

しかし、それが存在するかどうかをどのように判断できますか?

4

10 に答える 10

55
# 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");
于 2014-09-23T20:22:32.263 に答える
25

だから私は正しい道を進んでいました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"
}
于 2012-12-13T01:33:17.273 に答える
12

Existsメソッドを確認します。

[System.Diagnostics.EventLog]::Exists('Visual Studio Builds')
于 2012-12-13T06:46:55.697 に答える
3

存在するかどうかを簡単に確認するには:

$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!"
于 2015-04-09T08:52:22.003 に答える
2

以下のアプローチにより、フィルターのワークロードを削減できると思いますwhere

    try
    {
        Get-EventLog -LogName "Visual Studio Builds" -ErrorAction Ignore| Out-Null
    }
    catch {
        New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
    }
于 2012-12-13T05:34:27.707 に答える
2

それほど複雑ではありません:

 if (!(Get-Eventlog -LogName "Application" -Source "YourLog")){
      New-Eventlog -LogName "Application" -Source "YourLog"
 }
于 2013-07-25T09:23:14.010 に答える
0
$SourceExists = [System.Diagnostics.Eventlog]::SourceExists("XYZ")
if($SourceExists -eq $false){
    [System.Diagnostics.EventLog]::CreateEventSource("XYZ", "Application")
}

これを行うだけでは十分ではありません。イベント ソースを作成しても、$SourceExists常にfalse. CreateEventSourcethenを実行してテストしたところ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に感謝します (コメントで)。

于 2018-03-14T15:45:32.277 に答える