如何通过 System.Diagnostics.Process() 将参数传递给已经打开的终端

Posted

技术标签:

【中文标题】如何通过 System.Diagnostics.Process() 将参数传递给已经打开的终端【英文标题】:How to pass arguments to an already open terminal via System.Diagnostics.Process() 【发布时间】:2016-06-04 08:53:52 【问题描述】:

我一直在搞乱通过 C# 触发 bash 脚本。当我第一次使用参数调用“open”命令时,这一切都很好,这反过来又通过终端打开了我的 .command 脚本。

一旦使用“open”命令,Terminal 或 iTerm 将在后台保持打开状态,此时使用参数调用“open”命令将没有进一步的效果。遗憾的是,我不得不手动退出应用程序才能再次触发我的脚本。

如何将参数传递给已经打开的终端应用程序以在不退出的情况下重新启动我的脚本?

我搜索了在线广告似乎无法解决问题,解决打开代码已经花费了很多时间。非常感谢您的帮助。

这是我用来启动进程的 C# 代码:

var p = new System.Diagnostics.Process();
    p.StartInfo.FileName = "open";
    p.StartInfo.WorkingDirectory = installFolder;
    p.StartInfo.Arguments = "/bin/bash --args \"open \"SomePath/Commands/myscript.command\"\"";
    p.Start();

谢谢

编辑: 两个答案都是正确的,这可能对其他人有帮助:

    ProcessStartInfo startInfo = new ProcessStartInfo("/bin/bash");
    startInfo.WorkingDirectory = installFolder;
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardOutput = true;

    Process process = new Process();
    process.StartInfo = startInfo;
    process.Start();

    process.StandardInput.WriteLine("echo helloworld");
    process.StandardInput.WriteLine("exit");  // if no exit then WaitForExit will lockup your program
    process.StandardInput.Flush();

    string line = process.StandardOutput.ReadLine();

    while (line != null)
    
        Debug.Log("line:" + line);
        line = process.StandardOutput.ReadLine();
    
    process.WaitForExit();
    //process.Kill(); // already killed my console told me with an error

【问题讨论】:

【参考方案1】:

你可以试试:

在致电p.Start()之前:

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
// for the process to take commands from you, not from the keyboard

之后:

if (p != null)

    p.StandardInput.WriteLine("echo helloworld");
    p.StandardInput.WriteLine("executable.exe arg1 arg2");

(取自here)

【讨论】:

首先他必须重定向标准输入。您应该将其添加到您的答案中。 感谢我解决了这个问题,我会将完整的口头禅添加到我的问题中。你让我很开心,并且大大改进了我的代码。我正在将值写入文本文件以预先检索,这种方式要好得多,而且我不知道。 @DmitriyKhudorozhkov 自从尝试解决方案以来我遇到了问题,我最终发现了 RedirectStandardError 这让我明白了我无法成功触发命令并出现以下错误的原因:“errorline:/bin/bash : line 1: convert: command not found" 你知道为什么这个命令不起作用但是直接输入到 bash 终端时会正常工作吗?【参考方案2】:

这就是您可能正在寻找的:

获取用于写入应用程序输入的流。

MSDN | Process.StandardInput Property

// This could do the trick
process.StandardInput.WriteLine("..");

【讨论】:

以上是关于如何通过 System.Diagnostics.Process() 将参数传递给已经打开的终端的主要内容,如果未能解决你的问题,请参考以下文章

如何通过android上的ADB命令通过pc拨打电话?

如何通过 DBLINK 通过 DBLINK 调用 SELECT?

如何使用jquery通过.load通过跨域获取HTML元素的值

如何通过 Windows Azure 通过 GCM 通过唯一 ID 发送特定 Android 设备的通知?

如何通过方法(不是api)通过identityserver4获取访问令牌?

如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]