为什么通过路径中带空格的文件名通过 cmd 执行 arduino-cli 不起作用?
Why does execution of arduino-cli via cmd with file names with spaces in path not work?
我正在制作一个 C# 应用程序,它使用 arduino-cli. I'm calling it with the Process class using the ProcessStartInfo class 编译 Arduino 代码,当然还通过 cmd.exe
编译 Arduino 代码,这是绝对必要的。
arduino-cli.exe
忽略所有参数并在直接启动时输出以下两行五秒钟,而不是通过 cmd.exe
或从 PowerShell 控制台 运行 对其进行设置:
This is a command line tool.
You need to open cmd.exe and run it from there.
我可以select路径正确的目录,但是当我select另一个目录编译时,arduino-cli.exe
输出错误信息:
Error: unknown command "Studio" for "arduino-cli"
我认为这是因为我正在 selecting 的目录位于名为 Visual Studio Projects
的文件夹中,其名称中包含空格,我认为它将每个单词解释为单独的参数。
如何对通过 cmd.exe
传递给 arduino-cli.exe
的参数进行编码,以便在其完整限定文件名中包含空格的两个文件名(输入和十六进制文件)作为完整的参数字符串?
我在网上看到,如果我在路径前添加 @
它应该会修复它,但效果并不好。
当我直接在 Windows 命令提示符 window 中 运行 arduino-cli
命令行而不是 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);
``
我正在制作一个 C# 应用程序,它使用 arduino-cli. I'm calling it with the Process class using the ProcessStartInfo class 编译 Arduino 代码,当然还通过 cmd.exe
编译 Arduino 代码,这是绝对必要的。
arduino-cli.exe
忽略所有参数并在直接启动时输出以下两行五秒钟,而不是通过 cmd.exe
或从 PowerShell 控制台 运行 对其进行设置:
This is a command line tool.
You need to open cmd.exe and run it from there.
我可以select路径正确的目录,但是当我select另一个目录编译时,arduino-cli.exe
输出错误信息:
Error: unknown command "Studio" for "arduino-cli"
我认为这是因为我正在 selecting 的目录位于名为 Visual Studio Projects
的文件夹中,其名称中包含空格,我认为它将每个单词解释为单独的参数。
如何对通过 cmd.exe
传递给 arduino-cli.exe
的参数进行编码,以便在其完整限定文件名中包含空格的两个文件名(输入和十六进制文件)作为完整的参数字符串?
我在网上看到,如果我在路径前添加 @
它应该会修复它,但效果并不好。
当我直接在 Windows 命令提示符 window 中 运行 arduino-cli
命令行而不是 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);
``