无法从Java成功运行批处理脚本

时间:2016-01-28 02:11:41

标签: java batch-file

如果我在批处理文件(.bat)中运行它,以下批处理脚本可以正常工作。它获取SFTP服务器上的所有文件并下载到本地文件夹。

但是,如果我从Java代码运行它,它只获得4个文件。为什么它在获得4个文件后停止?

批处理脚本:

winscp.com /log=C:\winscp\logs\winscp_detailed.log /xmllog=C:\winscp\logs\winscp.log /command ^
    "open sftp://root:password@xx.xxx.xx.xx/ -privatekey=""C:\winscp\key.ppk"" -hostkey=""ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"" -passphrase=""password""" ^
    "get /home/SFTP/* C:\LocalFolder1\" ^
    "exit"

执行上述命令的Java代码:

public HashMap runExternalProgram_Windows(String Command) {

    String line;

    InputStream stderr = null;
    InputStream stdout = null;

    HashMap _m = new HashMap();

    try {

        Process process = Runtime.getRuntime ().exec (Command);

        Worker worker = new Worker(process);
        worker.start();
        try {
            worker.join(30000);
            if (worker.exit == null) {
                throw new Exception();                  
            }
        } catch(Exception ex) {
            _m.put("LOG_ERROR_EXTERNAL", "30 second time out...check connection");
            ex.printStackTrace();
            return _m;
        } finally {
            process.destroy();
        }

        stderr = process.getErrorStream ();
        stdout = process.getInputStream ();

        String _log_output = null;

        // clean up if any output in stdout
        BufferedReader brCleanUp = new BufferedReader (new InputStreamReader (stdout));
        while ((line = brCleanUp.readLine ()) != null) {
            if (_log_output==null) {
                _log_output = line + "\n";
            } else {
                _log_output = _log_output + line + "\n";                    
            }
        }

        brCleanUp.close();

        _m.put("LOG_OUTPUT", _log_output);

        String _log_error = null;
        // clean up if any output in stderr
        brCleanUp=new BufferedReader (new InputStreamReader (stderr));
        while ((line = brCleanUp.readLine ()) != null) {
            if (_log_error==null) {
                _log_error = line + "\n";
            } else {
                _log_error = _log_error + line + "\n";                  
            }
        }

        brCleanUp.close();          
        _m.put("LOG_ERROR_EXTERNAL", _log_error);

    } catch (Exception e) {
        //e.printStackTrace();
    }

    return _m;      

}


private static class Worker extends Thread {
    private final Process process;
    private Integer exit;
    private Worker(Process process) {
        this.process = process;
    }
    public void run() {
        try {
            exit = new Integer(process.waitFor());
        } catch (InterruptedException ignore) {
            return;
        }
    }  
}

0 个答案:

没有答案