Java截断psexec输出
Posted
技术标签:
【中文标题】Java截断psexec输出【英文标题】:Java truncating psexec output 【发布时间】:2015-11-03 21:59:37 【问题描述】:所以这就是交易。我有一个 Powershell 脚本,它调用 psexec 从远程系统运行 ping 测试到它连接的网络驱动器。这工作正常,ping 输出恢复并且工作得很好。但是当我在 Java 中运行相同的脚本 VIA runtime.exec 或 processbuilder 时,唯一出现的是第一行的一部分。
我一直在阅读有关整个错误流和输出流的所有内容,并尝试了大约 3 打代码来尝试解决这个问题。没有任何效果。
因此,我决定在批处理文件中运行 psexec 代码并从 ps1 脚本调用它可能会起作用...大声笑不
所以现在我正在将批处理输出到一个文件中,但这是行不通的。
所以我的问题是两种不同的选择。
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
IP.of.Server 的 Ping 统计信息: 数据包:发送 = 4,接收 = 4,丢失 = 0(丢失 0%), 大约以毫秒为单位的往返时间: 最小值 = 0 毫秒,最大值 = 0 毫秒,平均值 = 0 毫秒
使用手动和 Java 提要输入运行 VIA Java 时的脚本输出
ping server.being.pinged [IP.of.Server]
当我将结果输入 Java 或将其输入 txt 文件时会发生这种情况。我厌倦了从 sysinternals 网站以及其他网站上找到的所有内容,普遍的共识似乎是这已经被打破了,但我严重怀疑这一点。
哦,让我添加这个有趣的是我尝试运行带有 args 的批处理文件以从 powershell 创建 txt 并且仍然获得相同的返回。我完全不知所措,因为进入我的 Java 代码的所有其他内容都可以很好地打印到 JTextField 和窗格中,并且有些输出更长。
另外请注意,我什至暂停了我的 Java 代码和 powershell 脚本,认为 psexec 在结束之前无法完成。不确定我做对了。并且 2>null 可以防止 Java 崩溃,这是一个已知问题。
【问题讨论】:
“并尝试了大约 3 打代码” - 你能展示你最好的尝试吗? :-) Java 不会截断数据。您的代码可能会,可能会。 我扩展了这个废话。请查看所有添加的信息。 我自己想出来的。现在工作 100%! 【参考方案1】:对于 PSexec 发送输出的错误方式没有真正的解决方法,PAexec 根本没有做任何事情。所以现在我在远程系统 C 驱动器上创建一个批处理文件,并使用 psexec 告诉远程系统执行它。 ping 命令运行 echo off 并输出到同一目录中的文件。然后我使用 powershell 解析输出文件并获取我想要的内容然后删除文件。
【讨论】:
以上是关于Java截断psexec输出的主要内容,如果未能解决你的问题,请参考以下文章