Powershell启动作业-Java中的scriptblock等效错误,带有Callable/Future
大家好,Powershell全新推出 我想将下面的代码转换成java,这样我就不必在程序运行时在程序外部运行单独的Powershell脚本Powershell启动作业-Java中的scriptblock等效错误,带有Callable/Future,java,powershell,powershell-4.0,start-job,scriptblock,Java,Powershell,Powershell 4.0,Start Job,Scriptblock,大家好,Powershell全新推出 我想将下面的代码转换成java,这样我就不必在程序运行时在程序外部运行单独的Powershell脚本 [string] $wspaceDir = "C:\Temp\loadDir", [string] $scmLoc = "C:\Local Apps\IBM\SDP\scmtools\eclipse\scm.exe", [string] $portNumForDaemon = "61938" start-job -s
[string] $wspaceDir = "C:\Temp\loadDir",
[string] $scmLoc = "C:\Local Apps\IBM\SDP\scmtools\eclipse\scm.exe",
[string] $portNumForDaemon = "61938"
start-job -scriptblock {
Set-Location "$($args[1])"
Write-Host "Starting Daemon on port $args[2]" -foregroundcolor "Yellow"
&"$($args[0])" "daemon" "start" "$($args[1])" "--port" $args[2]
} -ArgumentList $scmLoc, $wspaceDir, $portNumForDaemon
到目前为止,我所掌握的关于它上面所做的事情的信息是在一个单独的线程中运行它,以便继续,而不是等待它完成
在java中,我试图模仿:
private static String portNumForDaemon = "61938";
private static String scmLoc = "C:\\Local Apps\\IBM\\SDP\\scmtools\\eclipse\\scm.exe";
private static String wspaceDir = "C:\\TempRQM";
public static void blah() {
ExecutorService pool = Executors.newSingleThreadExecutor();
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("cmd.exe", "/c", scmLoc + " daemon start " + wspaceDir + " --port " + portNumForDaemon);
try {
Process process = processBuilder.start();
System.out.println("process ping...");
ProcessReadTask task = new ProcessReadTask(process.getInputStream());
List<String> supplierNames = new ArrayList<String>();
Future<list<string>> future = pool.submit(task);
// no block, can do other tasks here
System.out.println("process task1...");
System.out.println("process task2...");
List<string> result = future.get(5, TimeUnit.SECONDS);
for (String s : result) {
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.shutdown();
}
}
private static class ProcessReadTask implements Callable<list<string>> {
private InputStream inputStream;
public ProcessReadTask(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public List<string> call() {
return new BufferedReader(new InputStreamReader(inputStream))
.lines()
.collect(Collectors.toList());
}
}
私有静态字符串portNumForDaemon=“61938”;
私有静态字符串scmLoc=“C:\\Local Apps\\IBM\\SDP\\scmtools\\eclipse\\scm.exe”;
私有静态字符串wspaceDir=“C:\\TempRQM”;
公共静态无效blah(){
ExecutorService池=Executors.newSingleThreadExecutor();
ProcessBuilder ProcessBuilder=新的ProcessBuilder();
命令(“cmd.exe”、“/c”、scmLoc+“守护程序启动”+wspaceDir+“--port”+portNumForDaemon);
试一试{
Process=processBuilder.start();
System.out.println(“进程ping…”);
ProcessReadTask=newProcessReadTask(process.getInputStream());
列表供应商名称=新的ArrayList();
Future=pool.submit(任务);
//无阻塞,可以在此处执行其他任务
System.out.println(“进程任务1…”);
System.out.println(“进程任务2…”);
列表结果=future.get(5,TimeUnit.SECONDS);
for(字符串s:结果){
系统输出打印项次;
}
}捕获(例外e){
e、 printStackTrace();
}最后{
pool.shutdown();
}
}
私有静态类ProcessReadTask实现可调用{
私有输入流输入流;
公共ProcessReadTask(InputStream InputStream){
this.inputStream=inputStream;
}
@凌驾
公共列表调用(){
返回新的BufferedReader(新的InputStreamReader(inputStream))
.行()
.collect(Collectors.toList());
}
}
尽管我很想运行它,但在所有可调用的工具- ,未来
- 上都出现了一个错误
我不确定我这样做是否正确。我甚至不确定这是否等同于Powershell的功能
而且Powershell/Java大师能够帮助我就太好了 正如您所说,PowerShell命令不监视作业输出(并且它不创建线程:在子进程中运行以
Start job
启动的后台作业)。但是您需要在Java中这样做吗?请注意,无需通过cmd/c
调用-只需直接使用其参数调用scmLoc
。您能举个例子吗@mklement0I无法帮助您解决可调用的问题和未来的问题(顺便说一句,如果您将问题编辑为包含您收到的错误消息,可能会有所帮助),但是我假设您的processBuilder
命令的工作方式如下:processBuilder.command(scmLoc,“daemon”,“start”,wspaceDir,“--port”,portNumForDaemon)代码>