所以这是交易。我有一个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不会崩溃,这是一个已知问题。
答案 0 :(得分:0)
对于PSexec发送输出并且PAexec无法执行任何操作的搞砸方式,没有真正的解决办法。所以现在我在远程系统C盘上创建一个批处理文件,并使用psexec告诉远程系统执行它。 ping命令运行echo off并输出到同一目录中的文件。然后我使用powershell来解析输出文件并获取我想要的内容然后删除文件。