Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell启动作业-Java中的scriptblock等效错误,带有Callable/Future_Java_Powershell_Powershell 4.0_Start Job_Scriptblock - Fatal编程技术网

Powershell启动作业-Java中的scriptblock等效错误,带有Callable/Future

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

大家好,Powershell全新推出

我想将下面的代码转换成java,这样我就不必在程序运行时在程序外部运行单独的Powershell脚本

[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)