2017-01-06 10 views
1

2台のWindowsマシンのイベントログからイベントを読み取ろうとしています。 1つはWindows 10 Enterprise(完全に動作する)で、もう1つはSmall Business Server 2008です.SBS2008のマシン出力は78文字目で切り捨てられますが、なぜ表示されません。SBS2008のデータ切り捨て

これは、私が実行しているPowerShellコマンドです:

get-eventlog Application -After (Get-Date).AddDays(-10) | 
Where-Object {$_.EntryType -like 'Error' -or $_.EntryType -like 
'Information'} | Format-Table -Property TimeGenerated, Index, 
EventID, EntryType, Source, Message -autosize | Out-String -Width 4000 

それは、両方のマシン上でPowerShellの編集ウィンドウ、無切り捨てで罰金を実行します。 私はGetEvents.ps1 -file PowerShellを使用して、コマンドウィンドウでそれを実行した場合、出力は切り捨てです: C:GetEvents.ps1 enter image description here

-file \ BITS> PowerShellの私はこれをやっていることをうまくすることはできません。これは、Javaコードです:

String command = "powershell.exe " + Cmd; 
Process powerShellProcess = Runtime.getRuntime().exec(command); 
powerShellProcess.getOutputStream().close(); 
String line; 
BufferedReader stdout = new BufferedReader(new InputStreamReader(powerShellProcess.getInputStream())); 
while ((line = stdout.readLine()) != null) { 
    if (line.length() > 0) { 
     System.out.println(line); 
    } 
} 

誰もがログの外のイベントを取得したり、私はそれが改行で分割されることなく、PowerShellスクリプトからの出力を読み込む方法を提案するためのより良い方法を提案することはできますか?これは、私がSBS2008顧客マシンで失敗するのを見つけるためにのみ、私のマシン(W10のマシン)で広範にテストしたので、かなり残念でした! 異なるマシンで使用されているライブラリとJavaのバージョンを確認しましたが、それらは同じです。私は最後の 'While'ブロック内の文字列の解析をいくつか行うので、println文ではなく、入力行は確実に切り捨てられます。

私はその後Get-wineventを使用してみましたが、コマンドにfilterhashtableフラグを設定すると、SBS2008で 'パラメータが正しくありません'と表示されても失敗します(W10では正常です)。 私は理想的には、特定のログファイルからすべてのイベントを取得することができます。なぜなら、特定のイベントIDは(それを保存できるためですが)同じ出力をすべてのWindowsオペレーティングシステムで同じ形式で取得することは事実上不可能です。どんな提案も大歓迎です。

+3

'|フォーマット表| Out-String'と呼ばれる。 "私はケーキのバッターをミックスし、オーブンに入れ、オーブンから取り出してケーキミキサーに戻し、それを得る? " Format-Tableは、コンソールセッションの管理者へのパイプライン終了表示用のもので、他には何も表示されません。それはより良いテーブルを作るためにデータを捨てるでしょう。 Format-TableがJava内に存在しないホスト上にデータを表示するためにデータを分割しようとすると、Out-String -width 4000はすべてそれを再び一緒に戻すことはありません。 – TessellatingHeckler

+0

JSONまたはCSVをJavaで読み込み、そこでフォーマットできますか? – TravisEz13

+0

これはありがたいことですが、それは私には問題が残っていますが、完璧な意味があります。Format-Tableを出すと、完全な文字列を得ることができますが、私にとって重要なEventID列は含まれません。 format-tableを使用せずにその列をインクルードするコマンドを取得するにはどうすればよいですか? –

答えて

0

SBS2008の回答はこちらです。 http://www.mcbsys.com/blog/2011/04/powershell-get-winevent-vs-get-eventlog/ SBS2008はハッシュテーブルを使用できません。filterxmlを使用する必要があります。残念ながら、SBS2008でfilterxmlを使用すると、エラーメッセージは返されず、その他のメッセージは返されません。これは、イベントビューア(https://blogs.msdn.microsoft.com/powershell/2011/04/14/using-get-winevent-filterxml-to-process-windows-events/)からのXMLクエリの切り取りと貼り付けの規定の方法を使用しています。 もっと研究した後、私は自分の望むものを並べ替えています。これは、(残念です)eventIndexとを欠いているが、それは一貫して、システム&アプリケーションeventlogsからイベントを返します。

$fx = '<QueryList> 
    <Query Id="0" Path="Application"> 
    <Select Path="Application">*[System[(Level=1 or Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) &lt;= 43200000]]]</Select> 
    </Query> 
</QueryList>' 
function Set-Culture([System.Globalization.CultureInfo] $culture) { [System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture ; [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture } ; Set-Culture en-US ; get-winevent -FilterXml $fx | out-string -width 470 

$fx = '<QueryList> 
    <Query Id="0" Path="System"> 
    <Select Path="System">*[System[(Level=1 or Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) &lt;= 43200000]]]</Select> 
    </Query> 
</QueryList>' 
Set-Culture en-US ; get-winevent -FilterXml $fx | out-string -width 470 

私は、これは他の誰かに役立つことを願っています!

関連する問題