Как выполнить команду оболочки на разных платформах в. NET Core? - PullRequest
0 голосов
/ 04 апреля 2020

В моем приложении. NET Core Console я получаю несколько команд в виде массива строк и хочу выполнить их как консольную команду (и, если возможно, показать их вывод в моем собственном приложении, но это не жесткое требование) .

Сначала я попытался проанализировать каждую команду, чтобы разделить их имена и аргументы и поместить их в ProcessStartInfo. Однако некоторые команды не работают (даже простые команды, такие как echo "Hello").

Теперь я переключился на вызов Powershell вместо этого так:

    static IEnumerable<ProcessStartInfo> ParseCommands(string[] args)
    {
        return args
            .Skip(1)
            .Select(q => new ProcessStartInfo()
            {
                FileName = "powershell",
                Arguments = q,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
            }).ToList();
    }

    static void RunCommand(ProcessStartInfo processInfo)
    {
        Console.WriteLine($"{processInfo.Arguments}");

        var process = new Process()
        {
            StartInfo = processInfo,
        };
        process.Start();

        while (!process.StandardOutput.EndOfStream)
        {
            Console.WriteLine(process.StandardOutput.ReadLine());
        }

        process.WaitForExit();
    }

Проблема в том, что я не думаю, этот может работать на Linux или MacOS. Есть ли какой-нибудь «стандартный» способ сказать моему приложению «запускать это, как если бы это была консольная команда»?


Это мой текущий код, использующий платформу для определения команды консоли, не стесняйтесь подскажите есть ли лучший способ:

    static IEnumerable<ProcessStartInfo> ParseCommands(string[] args)
    {
        var argsPrepend = "";
        var shellName = "/bin/bash";
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            shellName = "cmd";
            argsPrepend = "/c ";
        }

        return args
            .Skip(1)
            .Select(q => new ProcessStartInfo()
            {
                FileName = shellName,
                Arguments = argsPrepend + q,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
            }).ToList();
    }

    static void RunCommand(ProcessStartInfo processInfo)
    {
        Console.WriteLine($"{processInfo.Arguments.Substring(processInfo.FileName == "cmd" ? 3 : 0)}");

        var process = new Process()
        {
            StartInfo = processInfo,
        };
        process.Start();

        while (!process.StandardOutput.EndOfStream)
        {
            Console.WriteLine(process.StandardOutput.ReadLine());
        }

        process.WaitForExit();
    }
...