使用参数

时间:2017-07-02 19:28:02

标签: c# .net bash sh .net-core

我正在尝试从另一个运行一个.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核心共享框架主机

     

版本:1.1.0构建:   928f77c4bc3f49d892459992fb6e1d5542cb5e86

     

用法:dotnet [common-options] [[options] path-to-application]

     

常用选项: - help显示.NET Core   共享框架主机帮助。 --version显示   .NET核心共享框架主机版本。

     

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

     

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

     

如果您正在调试共享框架主机,请设置' COREHOST_TRACE'   到' 1'在你的环境中。

     

要开始为.NET Core开发应用程序,请安装   SDK来自:http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

所以我似乎非常喜欢运行命令 dotnet 而没有dll路径参数。

3 个答案:

答案 0 :(得分:3)

您需要将参数转义为-c,以便它是一个参数:

psi.Arguments = "-c \"dotnet /home/myuser/PublishOutput/myprogram.dll\"";

答案 1 :(得分:1)

如果您想从您的 c# .net 核心应用程序中使用特定命令(例如 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 字符串
如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始。

答案 2 :(得分:0)

我进行了一些更改并使消息可以同步输出

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);
    }
}

}