Почему выполнение arduino-cli через cmd с именами файлов с пробелами в path не работает?

#c# #cmd #arduino #processstartinfo

#c# #cmd #arduino #processstartinfo

Вопрос:

Я создаю приложение на C #, которое компилирует код Arduino с помощью arduino-cli. Я вызываю его с помощью класса Process, используя класс ProcessStartInfo и, конечно, с помощью cmd.exe которого это абсолютно необходимо.

arduino-cli.exe игнорирует все аргументы и выводит следующие две строки в течение пяти секунд при непосредственном запуске вместо запуска через cmd.exe консоль PowerShell или из нее:

Это инструмент командной строки.

Вам нужно открыть cmd.exe и запустите его оттуда.

Я могу выбрать каталог с правильным путем, но когда я выбираю другой каталог для компиляции, выводится сообщение arduino-cli.exe об ошибке:

Ошибка: неизвестная команда «Studio» для «arduino-cli»

Я думаю, это потому, что каталог, который я выбираю, находится в папке с именем Visual Studio Projects , содержащим пробелы в его имени, и я думаю, что он интерпретирует каждое слово как отдельный аргумент.

Как закодировать аргументы, передаваемые через cmd.exe to arduino-cli.exe , чтобы два имени файлов (входной и шестнадцатеричный файл) содержали пробелы в их полных именах файлов в качестве полных строк аргументов?

Я читал в Интернете, что если я добавлю @ перед path, это должно исправить, но это мало что дало.

Это также происходит, когда я запускаю arduino-cli командную строку непосредственно в окне командной строки Windows, а не в C #. Проблема, вероятно, связана с синтаксисом командной строки.

Вот мой код на C #:

 ProcessStartInfo cmd = new ProcessStartInfo();

cmd.FileName = "cmd.exe";
cmd.WindowStyle = ProcessWindowStyle.Normal;

hexFile = Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))   "\cache/a";

cmd.Arguments = "/k cd "   Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))   "\avr-g  \arduino-cli\bin"
    " amp; arduino-cli --compile "   @inFile   " --output "   @hexFile   " multi";
            
//file = hexFile;
Process.Start(cmd);
 

Ответ №1:

Проблема заключалась в том, что путь был слишком длинным, и ему требовалась «» вокруг пути. Вот как выглядит код сейчас —

  ProcessStartInfo cmd = new ProcessStartInfo();

 cmd.FileName = "cmd.exe";
 cmd.WindowStyle = ProcessWindowStyle.Normal;

 string name = GenerateName(8);
 hexFile = Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))   "\cache/"   name;

 cmd.Arguments = "/k cd "   Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))   "\avr-g  \arduino-cli\bin"
     " amp; arduino-cli compile -b arduino:avr:uno "   """   @inFile   """   " --build-path "   """   @hexFile   """;

 file = Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))   "\cache\"   name   "\"   Path.GetFileName(inFile)   ".hex";
 Process.Start(cmd);
 Thread.Sleep(3000);
``