我正在执行一堆SQL脚本,并尝试在执行每个文件后读取输出日志文件,以查找错误。
这是我执行脚本的方式。
String strCommand = "sqlcmd -S SERVERNAME -d DBNAME -U USERNAME -P PASSWORD -r0 -i \"SCRIPT.sql\" 2> \"OUTPUT.LOG\" 1> NULL";
Process process = Runtime.getRuntime().exec(strCommand);
process.waitFor();
我已将标准输出重定向到
NULL
,并将错误重定向到日志文件。在执行完以上语句之后,我立即尝试使用File Reader
和BufferedReader
读取OUTPUT.LOG文件的内容。尝试打开OUTPUT.LOG文件时引发异常。(该系统找不到指定的文件)
我检查了应该保存文件的路径,不用说,它不存在。当我尝试通过命令提示符手动执行命令时,它可以正常工作,并且按预期将日志文件写入错误。我究竟做错了什么?
最佳答案
如果您是从命令外壳程序运行的,则重定向(2>等)将起作用,但如果您是直接从Java这样运行的,则无法进行重定向。
尝试以下操作(对于Windows):
String strCommand = "cmd /c sqlcmd -S SERVERNAME -d DBNAME -U USERNAME -P PASSWORD -r0 -i \"SCRIPT.sql\" 2> \"OUTPUT.LOG\" 1> NULL";
Process process = Runtime.getRuntime().exec(strCommand);
process.waitFor();
注意添加了
cmd /c
,它将在命令外壳中运行字符串。