尝试通过Java运行cmd命令...只运行前半部分

时间:2016-03-07 12:18:03

标签: java postgresql

我使用psql在Postgres数据库上通过Java运行以下查询:

psql.exe -U <user> -w -h <host> -d <db_name> -a -f <file> 2> "<path_to_file>\psql.log"

最初,java程序确实创建了一段时间。然后我遇到了另一个问题,它没有覆盖日志文件。因此,每次通过java创建此日志文件后,我都会使用file.delete()函数。

现在,由于某种原因,Java甚至没有创建日志文件。如果我在命令提示符下手动运行上面的命令,它运行绝对正常,但不是通过java代码。我可以看到这个命令在java日志中运行,但是即使我删除了file.delete()函数它也没有创建日志文件

我研究了很多,但找不到任何解决方案。任何帮助都将受到高度赞赏。

它的代码很长。所以我会告诉你相关部分。

我从一个线程调用一个函数。该功能的代码如下:

public static void SaveACopyfileToServer(int auditid,String filepath,String fname,String tb_name,String plpgsql_path) throws Exception
    {
        Map<String, String> env = System.getenv();

        String plpgsql = "\""+plpgsql_path+"\" -U "+env.get("PG_USER")+" -w -h "+env.get("PG_HOST")+" -d "+env.get("PG_DB")+" -a -f "+"\""+filepath+"copy_"+tb_name+auditid+".sql\" 2> \"C:\\ER\\ETL\\logs\\psql.log\"";
        System.out.println(plpgsql);
        Process p = Runtime.getRuntime().exec(plpgsql);
        p.getOutputStream().close(); 
        p.waitFor();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        Calendar cal10 = Calendar.getInstance();
        System.out.println("Data loaded for "+tb_name+auditid+" at "+sdf.format(cal10.getTime()));
    }

我也尝试了以下代码:

String plpgsql = "\""+plpgsql_path+"\" -U "+env.get("PG_USER")+" -w -h "+env.get("PG_HOST")+" -d "+env.get("PG_DB")+" -a -f "+"\""+filepath+"copy_"+tb_name+auditid+".sql\" 2> \"C:\\ER\\ETL\\psql_" +auditid +".log\"";
ProcessBuilder pb = new ProcessBuilder("C:/Windows/System32/cmd.exe",plpgsql);
System.out.println(plpgsql);
Process p =pb.start();
p.getOutputStream().close();
p.waitFor();

String filename = filepath+"copy_"+tb_name+auditid+".sql";
String psqllog_file = "C:\\ER\\ETL\\logs\\psql_" +auditid +".log"; 
Process p = Runtime.getRuntime().exec(new String [] { plpgsql_path, 
                              "-U", 
                              env.get("PG_USER"), 
                              "-w", 
                              "-h", 
                              env.get("PG_HOST"), 
                              "-d", 
                              env.get("PG_DB"), 
                              "-a", 
                              "-f", 
                              filename, 
                              "2>", 
                              psqllog_file });

如果我通过批处理文件运行它,那么我得到并且错误,Windows无法使用java中的以下代码找到-U

String plpgsql = "\""+plpgsql_path+"\" -U "+env.get("PG_USER")+" -w -h "+env.get("PG_HOST")+" -d "+env.get("PG_DB")+" -a -f "+"\""+filepath+"copy_"+tb_name+auditid+".sql\" 2> \"C:\\ER\\ETL\\psql_" +auditid +".log\"";
    ProcessBuilder pb = new ProcessBuilder("C:/Windows/System32/cmd.exe","/c","start",plpgsql);
    System.out.println(plpgsql);
    Process p =pb.start();
    p.getOutputStream().close();
    p.waitFor();

我现在已经坚持了很长时间。任何帮助都会非常感激。

P.S:我是Stackoverflow的新手,仍在努力学习如何回复评论以通知对方,因为我认为我的回复没有被发送到其他人的邮箱。

0 个答案:

没有答案