从.NetCore运行带有参数的bash命令

11

我正在尝试从一个 .NetCore 程序中运行另一个程序。

        ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = "sh";
        psi.Arguments = "-c dotnet /home/myuser/PublishOutput/myprogram.dll";
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;

        Process proc = new Process
        {
            StartInfo = psi
        };


        proc.Start();

        string error = proc.StandardError.ReadToEnd();

        if (!string.IsNullOrEmpty(error))
            return "error: " + error;

        string output = proc.StandardOutput.ReadToEnd();

        proc.WaitForExit();

        return output;

我得到的输出如下:

Microsoft .NET Core 共享框架宿主

版本:1.1.0 生成:928f77c4bc3f49d892459992fb6e1d5542cb5e86

用法: dotnet [常规选项] [[选项] 应用程序路径]

常规选项: --help 显示 .NET Core 共享框架宿主帮助。 --version 显示 .NET Core 共享框架宿主版本。

选项: --fx-version 要使用来运行应用程序的已安装共享框架的版本。
--additionalprobingpath 包含探测策略和要进行探测的程序集的路径。

应用程序路径: 要执行的 .NET Core 托管应用程序、dll 或 exe 文件的路径。

如果您正在调试共享框架宿主,请在环境中将 'COREHOST_TRACE' 设置为 '1'。

要开始开发 .NET Core 应用程序,请从以下网址安装 SDK:http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

所以看起来就像没有指定dll路径参数一样运行命令dotnet


ProcessStartInfo 是属于哪个命名空间? - Aaron Franke
3个回答

6
你需要对 -c 的参数进行转义,以使其成为一个单一的参数:
psi.Arguments = "-c \"dotnet /home/myuser/PublishOutput/myprogram.dll\"";

仍然是同样的问题。我添加了引号,但得到了相同的答案。 - holocen
错误信息完全一样吗?我尝试了那个示例代码,它可以工作。如果 DLL 路径不正确,您应该会收到类似于“找不到与命令匹配的可执行文件”的消息。 - Martin Ullrich
是的。完全一样。 - holocen
如果路径中有空格,因此参数需要引号怎么办?转为使用单引号吗? - formicini
@formicini 我建议您首先尝试双重转义 - \\\" - Martin Ullrich

4
我更改了一些内容并使消息可以同步输出。
using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace ExecuteCommandX
{
 /// <summary>
///  sample by linkanyway@gmail.com
/// </summary>
/// <param name="args"></param>
internal static class Program
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="args"></param>
    // ReSharper disable once UnusedParameter.Local
    private static void Main(string[] args)
    {
        var psi = new ProcessStartInfo
        {
            FileName = "ping",
            Arguments = "-c 3 8.8.8.8",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        };

        var proc = new Process
        {
            StartInfo = psi
        };

        proc.Start();



        Task.WaitAll(Task.Run(() =>
        {
            while (!proc.StandardOutput.EndOfStream)
            {
                var line = proc.StandardOutput.ReadLine();
                Console.WriteLine(line);
            }
        }), Task.Run(() =>
        {
            while (!proc.StandardError.EndOfStream)
            {
                var line = proc.StandardError.ReadLine();
                Console.WriteLine(line);
            }
        }));


        proc.WaitForExit();
        Console.WriteLine(proc.ExitCode);
    }
}

}


2

如果你想从c# .net core应用程序运行具有特定命令(例如find / -name image.png)的Linux程序,你可以使用以下代码片段:

            try
            {
                var process = new Process();
                var processStartInfo = new ProcessStartInfo()
                {
                    WindowStyle = ProcessWindowStyle.Hidden,
                    FileName = $"/bin/bash",
                    WorkingDirectory = workingDirectory = "/mnt",
                    Arguments = $"-c \"find / -name image.png\"",
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false
                };
                process.StartInfo = processStartInfo;
                process.Start();

                String error = process.StandardError.ReadToEnd();
                String output = process.StandardOutput.ReadToEnd();

            }
            catch(Exception ex)
            {
                //_logger.LogError(ex.Message, ex);
                throw;
            }

关于参数的说明:

  • FileName = $"/bin/bash" 对于您可能使用的所有shell命令,请使用此文件名
  • WorkingDirectory = workingDirectory = "/mnt" 这只是一个示例,如果您运行的命令需要文件(例如file.png),则它将相对于工作目录查找文件。
  • Arguments = $"-c "find / -name image.png"" 在cli中运行以下命令:/bin/bash -c "find / -name image.png"

-c 是必须的才能使其正常工作,如manpage中所述:

-c string
如果存在-c选项,则从string中读取命令。 如果有参数在字符串后面,则它们被分配给位置参数,从$0开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接