- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在绞尽脑汁地试图找出为什么我使用 ProcessBuilder & Process 通过 Java 执行的命令不起作用。我在 Windows 命令行中运行“相同”命令,它按预期工作。它们一定是不一样的,但我一辈子也无法找出原因。
命令是这样的:
ccm start -nogui -m -q -n ccm_admin -r developer -d /path/to/db/databasename -s http://hostname:8400 -pw Passw0rd789$
输出应该是一个单行字符串,我需要获取它并将其设置为环境变量(因此是 BufferedReader
的 v. 基本使用)。
我的 Java 代码在运行命令时出现应用程序错误,看起来像这样,入口点为 startCCMAndGetCCMAddress()
:
private static String ccmAddress = "";
private static final String DATABASE_PATH = "/path/to/db/databasename";
private static final String SYNERGY_URL = "http://hostname:8400";
private static final String USERNAME = "ccm_admin";
private static final String PASSWORD = "Passw0rd789$";
private static final String USER_ROLE = "developer";
public static List<String> getCCMStartCommand() {
List<String> command = new ArrayList<String>();
command.add("cmd.exe");
command.add("/C");
command.add("ccm");
command.add("start");
command.add("-nogui");
command.add("-m");
command.add("-q");
command.add("-n "+USERNAME);
command.add("-r "+USER_ROLE);
command.add("-d "+DATABASE_PATH);
command.add("-s "+SYNERGY_URL);
command.add("-pw "+PASSWORD);
return command;
}
private static String startCCMAndGetCCMAddress() throws IOException, CCMCommandException {
int processExitValue = 0;
List<String> command = getCCMStartCommand();
System.err.println("Will run: "+command);
ProcessBuilder procBuilder = new ProcessBuilder(command);
procBuilder.redirectErrorStream(true);
Process proc = procBuilder.start();
BufferedReader outputBr = new BufferedReader(new InputStreamReader(proc.getInputStream()));
try {
proc.waitFor();
} catch (InterruptedException e) {
processExitValue = proc.exitValue();
}
String outputLine = outputBr.readLine();
outputBr.close();
if (processExitValue != 0) {
throw new CCMCommandException("Command failed with output: " + outputLine);
}
if (outputLine == null) {
throw new CCMCommandException("Command returned zero but there was no output");
}
return outputLine;
}
System.err.println(...)
的输出是:
Will run: [cmd.exe, /C, ccm, start, -nogui, -m, -q, -n ccm_admin, -r developer, -d /path/to/db/databasename, -s http://hostname:8400, -pw Passw0rd789$]
最佳答案
我认为您需要单独提供每个参数,并且没有前导/尾随空格,而不是连接选定的参数,例如“-pw PASSWORD”。这样您就可以使用正确的参数集调用该进程(就像从命令行看到的那样)
关于java - 通过 Java ProcessBuilder 运行命令与在 Shell 中运行命令不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2577507/
是否可以将 ProcessBuilder 创建的一个进程的输出传递给另一个 ProcessBuilder 创建的另一个进程?例如,如果我尝试执行此 shell 命令: ls | grep build.
我在使用 ProcessBuilder 运行项目中的类时遇到问题。我的代码: public class Main { public static void main(String[] args
我有一段类似这样的代码 File f = new File("Audio/Testing/mbgitr.wav"); try { ProcessBuilder pb = new
我试图了解更多关于 ffmpeg 在 JavaCV for android studio 中的使用情况,并且对于我正在尝试使用 ProcessBuilder 的上述任务。我尝试编写一个简单的程序来调试
我正在编写一个 Java 程序,它应该是 GUI 前端,它利用三级 C 程序为各种标签生成一些值。 但我不想硬编码 C 程序的路径。我只希望 Java 程序执行 C 程序,前提是它位于我运行 Java
我真的不熟悉使用线程,所以我希望有人能帮助我找出最好的方法。 我的 java 应用程序中有一个 JButton...当您单击该按钮时,我有一个进程生成器,它创建一个执行一些外部 python 代码的进
在主机“A”上,我通过将值插入数据库中的表来启动事务。一旦插入,我就会调用 processBuilder 来刷新主机“B”,而主机“B”又应该将更新的值从同一数据库表加载到缓存。但这些值没有被加载。
我关注了这个tutorial为插件代码实现java沙箱。插件代码使用以下权限运行: private PermissionCollection pluginPermissions() { Per
这个问题已经有答案了: process.waitFor() never returns (12 个回答) 已关闭 3 年前。 我使用以下代码运行命令: open class AppRunner {
我正在尝试使用 Linux 下的 ProcessBuilder 类将 mp3 文件解码为 wav 文件。由于某种原因,该过程没有停止,因此我必须手动取消它。 有人可以给我一些提示吗?我认为引用的代码很
好吧,我尝试了十几种不同的方法,但没有成功。我想执行自定义 exe 并获取输出。它在命令提示符下运行良好。我让“dir”工作正常,但custom.exe 不行。这是代码: List command
在尝试执行代码块(更具体地说是 Java 中的 ProcessBuilder 类)时,我遇到了一个奇怪的问题 有效的代码: package modules.user.verify; import ja
我在使用 > 运算符写入 Process Builder 中的文件时遇到问题。实际的过程将运行良好,让我使用 InputStreamReader 等来解析输出。我希望使用命令行将进程写入文件,例如 >
使用 ProcessBuilder 运行命令时可以规定时间吗?像这样: ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "d
我想在 JAVA 程序中执行 EXE 文件。 它工作正常,但我希望 EXE 的输出立即出现在我的 JAVA 程序的文本区域中。 目前,我在“ping”命令完全完成后得到输出(因此 JAVA 程序挂起大
我正在使用 Java ProcessBuilder 执行两个 shell 脚本。我希望两次执行之间有 10 秒的时间间隔。这就是我使用线程的原因。但以下代码不会执行 shell 脚本(没有它们执行的线
我正在运行这个(kotlin-)代码: val proc = ProcessBuilder("sed", "s/bla/blub/g").start() val reader = BufferedRe
我正在使用进程生成器从 postgres 运行 psql 命令来调用 copy 命令来导出一些表。 我的工作流程如下: String sql = "\"\\copy ( SELECT * from t
我需要使用 java.lang.ProcessBuilder 将使用“sudo”和“su”的不同 sh 命令从我的 java 应用程序传递到 Linux。 这些命令非常相似,但有些有效,有些无效。当我
我今天在设置一组本地通信程序时遇到了这个问题。基本上,我的一个应用程序正在向另一个应用程序发送一些数据,并且该数据的一部分是一个包含要执行的命令的字符串(就像您从命令行执行的那样)。举例来说: g++
我是一名优秀的程序员,十分优秀!