Java截断psexec输出

时间:2015-11-03 21:59:38

标签: java output outputstream psexec

所以这是交易。我有一个Powershell脚本,它调用psexec从远程系统运行ping测试到它连接的网络驱动器。这工作正常,ping输出回来并且工作得很好。但是当我在Java中运行相同的脚本VIA runtime.exec或processbuilder时,唯一显示的就是第一行的一部分。

我一直在阅读有关整个错误流和输出流的所有内容,并尝试了大约3行代码来尝试修复此问题。没有任何效果。

有了这个我决定可能在批处理文件中运行psexec代码并从ps1脚本调用它可能有效... lol nope

所以现在我将批处理输出到一个文件,但是没有用。

所以我的问题是两个不同的选择。

1)有没有人有解决方法。如你所知,ping命令大约是11行,而我想要的是" Average = ms"。

2)有没有办法在从Java调用时将批处理与Java隔离,这样psexec输出就不会被截断,因为Java不知道如何不因错误而切断输出。

根据要求,我正在使用的代码。 这会从powershell脚本

中获取输出
Runtime runtime = Runtime.getRuntime();
Process proc;
proc = runtime.exec("powershell \\\\[computer]\\c$\\" + Main.setDirectoriesForScriptsAndLogs + "\\scripts\\TPCAuto.ps1 " +  pcname + " " + ticket + " " + usid + " " + Main.GUIver);
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
Main.txtUpdates.setText("Gathering performance data");
AllUpdates.allUpdates.setText("Gathering performance data");    
while ((line = reader.readLine()) != null){
    //listens for key markers from the powershell script and displays the output to a JTestField or JTestPane
}
reader.close();
proc.getOutputStream().close();
Thread.currentThread().interrupt();
return;

这是简化的PowerShell脚本

[string]$Hostname = $args[0]
[string]$HdriveA = $args[1]
$GetDFSSplit= ""
$DFS = ""
$HomeDrivedropped = $HdriveA -replace ".{8}$"
$FindDFS = \\[computer]\c$\SDS\Extra\dfsutil.exe link $HomeDrivedropped
$GetDFSSplit = $FindDFS.Split("\") | select 
[String]$DFS = $GetDFSSplit[5]
write-host ". 2 @ DFS Host = $DFS"
$PingH = "ping $DFS"
$testingagain = \\[computer]\c$\SDS\Extra\psexec\psexec.exe -d \\$Hostname -s cmd /c ping $DFS > c:\temp\output.txt
write-host ". 5 @ $testingagain" <-- this is feeding to Java so it knows where to display the output

手动提供脚本并手动运行(不是VIA Java)时的输出注意:powershell_ISE和Powershell控制台都显示为结果

  

使用32个字节的数据ping server.being.pinged [IP.of.Server]:   来自IP.of.Server的回复:bytes = 32 time&lt; 1ms TTL = 251   来自IP.of.Server的回复:bytes = 32 time&lt; 1ms TTL = 251   来自IP.of.Server的回复:bytes = 32 time&lt; 1ms TTL = 251   来自IP.of.Server的回复:bytes = 32 time&lt; 1ms TTL = 251

     

IP.of.Server的Ping统计信息:       数据包:已发送= 4,已接收= 4,已丢失= 0(0%丢失),   以毫秒为单位的近似往返时间:       最小值= 0ms,最大值= 0ms,平均值= 0ms

使用手动和Java Feed输入VIA Java运行时的脚本输出

  

Ping server.being.pinged [IP.of.Server]

当我将结果提供给Java或将其提供给txt文件时会发生这种情况。我厌倦了从sysinternals网站以及其他网站上找到的所有内容,而且普遍的共识似乎是这已经破了,但我对此表示怀疑。

哦,让我添加它以获得乐趣我尝试使用args运行批处理文件以从powershell创建txt并仍然获得相同的返回。我完全失去了,因为我的Java代码中的所有其他内容都打印到了JTextField和Pane,并且有一些输出更长。

另请注意,我甚至暂停了我的Java代码和PowerShell脚本,认为psexec在结束之前无法完成。不确定我做得对。并且2&gt; null使Java不会崩溃,这是一个已知问题。

1 个答案:

答案 0 :(得分:0)

对于PSexec发送输出并且PAexec无法执行任何操作的搞砸方式,没有真正的解决办法。所以现在我在远程系统C盘上创建一个批处理文件,并使用psexec告诉远程系统执行它。 ping命令运行echo off并输出到同一目录中的文件。然后我使用powershell来解析输出文件并获取我想要的内容然后删除文件。