SBS2008上的数据截断

时间:2017-01-06 15:32:39

标签: java powershell truncate

我正在尝试从两台Windows机器的事件日志中读取事件。一个是Windows 10企业版(完美运行),一个是Small Business Server 2008.在SBS2008上,机器输出被截断为第78个字符,但我看不出原因。

这是我正在运行的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编辑窗口中运行良好,没有截断。 如果我使用powershell -file GetEvents.ps1在命令窗口中运行它,则会截断输出: C:\ BITS> powershell -file GetEvents.ps1 enter image description here

我无法弄清楚这是做什么的。这是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脚本中读取输出,而不会被回车分解?这是非常令人失望的,因为我在我的机器(W10)上进行了大量测试,结果发现它在SBS2008客户机器上失败了! 我检查了不同机器上使用的库和java版本,它们是相同的。这不是println语句,因为我在最后的'While'块中对字符串进行了一些解析,并且传入的行肯定会被截断。

我随后尝试使用Get-winevent,但是当我在命令上放置一个filterhashtable标志时,它在SBS2008上运行时失败,说'参数不正确'' (在W10上正常工作)。 我的理想是能够从特定的日志文件中获取所有事件,因为给定的eventID(因为我可以存储它),但似乎几乎不可能以相同的格式在所有Windows操作系统上获得相同的输出。欢迎任何建议。

1 个答案:

答案 0 :(得分: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(这是一个耻辱),但它始终从系统&应用程序事件日志:

$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

我希望这对其他人有用!