ProcessStartInfo запускает "cmd.exe" для запуска команд "nvm" для установки версий узлов, появляется сообщение об ошибке ассоциации программы - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь автоматизировать настройку машины, используя net core 2.0 с консольным приложением, и мне нужно выполнить несколько команд nvm для настройки версий узлов.

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

У этого файла нет программы, связанной с ним для выполнения этого действия.Пожалуйста, установите программу или, если она уже установлена, создайте связь на панели управления «Программы по умолчанию».

Если я запускаю файл .bat непосредственно из cmd, он работает нормально, но когда мое консольное приложение запускает его, яполучить эту ошибку.

Команды 'file.bat':

nvm version
nvm install 6.11.4
nvm use 6.11.4
nvm list
npm --version

Моя функция csharp для запуска команды:

public static int ExecuteCommand()
{
    int exitCode;
    ProcessStartInfo processInfo;
    Process process;

    processInfo = new ProcessStartInfo("cmd.exe", $"/C file.bat")
    {
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true
    };

    process = Process.Start(processInfo);

    process.OutputDataReceived += (s, e) =>
    {
        Console.ForegroundColor = ConsoleColor.DarkGray;
        Console.WriteLine("cmd >" + e.Data);
        Console.ResetColor();
    };
    process.BeginOutputReadLine();
    process.ErrorDataReceived += (s, e) =>
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(e.Data);
        Console.ResetColor();
    };
    process.BeginErrorReadLine();

    process.WaitForExit();

    exitCode = process.ExitCode;

    Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand");
    process.Close();

    return exitCode;
}

Я ожидаю, чтоэто работает, потому что после этого мне нужно будет выполнить несколько других команд, таких как npm install, gulp install и т. д.

Есть идеи, что может произойти?

1 Ответ

0 голосов
/ 24 декабря 2018

Основываясь исключительно на тестировании, если вы измените этот раздел:

processInfo = new ProcessStartInfo("cmd.exe", $"/C file.bat")
{
    CreateNoWindow = true,
    UseShellExecute = false,
    RedirectStandardError = true,
    RedirectStandardOutput = true
};

, чтобы не использовать аргументы конструктора и вместо этого вручную установить такие параметры, как:

processInfo = new ProcessStartInfo()
{
    FileName = "cmd.exe",
    Arguments = $"/C file.bat",
    CreateNoWindow = true,
    UseShellExecute = false,
    RedirectStandardError = true,
    RedirectStandardOutput = true
};

.Не уверен, почему, поскольку из кода github в ProcessStartInfo конструктор просто получает аргументы и сохраняет их в соответствующих свойствах (FileName и Arguments).

...