c# - 为什么使用路径中带有空格的文件名通过 cmd 执行 arduino-cli 不起作用?
问题描述
我正在制作一个用arduino-cli编译 Arduino 代码的 C# 应用程序。我使用ProcessStartInfo类和Process类调用它,当然通过它是绝对必要的。cmd.exe
arduino-cli.exe
忽略所有参数并在直接启动它时输出以下两行 5 秒钟,而不是通过cmd.exe
或从 PowerShell 控制台运行它:
这是一个命令行工具。
您需要打开 cmd.exe 并从那里运行它。
我可以选择具有正确路径的目录,但是当我选择另一个要编译的目录时,会出现arduino-cli.exe
错误消息的输出:
错误:“arduino-cli”的未知命令“Studio”
我认为这是因为我选择的目录位于一个名为的文件夹Visual Studio Projects
中,其名称中包含空格,我认为它将每个单词解释为单独的参数。
如何对通过cmd.exe
to传递的参数进行编码,arduino-cli.exe
以便两个文件名(输入和十六进制文件)在其完整的限定文件名中包含空格作为完整的参数字符串?
我在网上读到,如果我@
在路径之前添加它应该修复它,但它并没有做太多。
当我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"
+ " & arduino-cli --compile " + @inFile + " --output " + @hexFile + " multi";
//file = hexFile;
Process.Start(cmd);
解决方案
问题是路径太长,需要在路径周围加一个“”。这就是代码现在的样子 -
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"
+ " & 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);
``
推荐阅读
- php - 动态 HTML 图像链接从 PHP 中的数据库中提取错误信息
- javascript - django AdminDateWidget: Uncaught ReferenceError: quickElement is not defined
- java - 使用 JSch 获取远程 bash shell 但自动完成功能不起作用
- java - 在 Java 中通过控制台编辑给定的字符串
- google-maps - Flutter Maps:如何更改标记点击上的标记图标
- string - 如果包含特定字符串,则阻止 URL
- java - 在 Lucene 中使用 CharTermAttribute 显示整行
- r - R - 从格子改变 bwplot 上的箱线图
- java - 出现错误在范围内无法访问折线类型的封闭实例
- java - 如何管理 ThreadPoolTaskExecutor 来阻止一些请求