我在C#中创建了一个C ++代码编辑器,现在我正在尝试调用g++
来编译源文件。所以我除了我的程序之外还复制了TDM-GCC安装并编写了一个小批量脚本来调用它。
@echo off
@set PATH="%~dp0TDM-GCC-32\bin\";%PATH%
call "%~dp0TDM-GCC-32\mingwvars.bat"
cd %1
"%~dp0TDM-GCC-32\bin\g++.exe" %2 -o %3
从C#代码开始,我试图像在这段代码中一样使用CMD来调用这个脚本。
string fileName = Path.GetFileName(CurrentFile);
string exeName = Path.GetFileNameWithoutExtension(CurrentFile) + ".exe";
string workingDir = Directory.GetParent(CurrentFile) + "";
string compile = Directory.GetParent(Application.ExecutablePath) + "\\compile.cmd";
File.Delete(Path.Combine(workingDir, exeName));
StartProcess(true, "cmd", "/c", "\"" + compile + "\"", workingDir, fileName, exeName);
这是StartProcess
方法:
void StartProcess(bool hidden, string command, params string[] args)
{
ProcessStartInfo pStartInfo = new ProcessStartInfo();
pStartInfo.FileName = command;
pStartInfo.Arguments = string.Join(" ", args);
pStartInfo.UseShellExecute = false;
if (hidden)
{
pStartInfo.RedirectStandardError = true;
pStartInfo.RedirectStandardOutput = true;
pStartInfo.CreateNoWindow = true;
}
Process proc = new Process();
proc.StartInfo = pStartInfo;
proc.Start();
logBox.Clear();
if (hidden)
{
while (!proc.StandardError.EndOfStream)
{
logBox.AppendText(GetTimestamp() + " Error: " + proc.StandardError.ReadLine() + Environment.NewLine);
}
}
}
更新:26-9-14
我怀疑是否曾经调用批处理文件,因为如果我从cmd调用它,它就会起作用。所以我尝试echo
批处理文件中的标准错误,如下所示:
echo %PATH% 1>&2
我可以看到GCC的bin文件夹也在路径中,但由于某种原因,exe没有被创建。但有时,脚本可以工作,并且exe会被创建。
但每当我执行此操作时,LOG中都没有任何内容,也没有创建可执行文件。我知道TDM-GCC的bin文件夹必须在PATH中,但这就是批处理脚本的第二行需要做的事情。不知道这是什么以及为什么会出现这个错误。
更新结束
有关如何使其正常工作的任何建议?
感谢。
答案 0 :(得分:1)
我不知道下面的任何内容是否对这个问题有帮助。但至少这些提示在任何情况下都应该是有用的。
我建议使用批处理文件
@echo off
call "%~dp0TDM-GCC-32\mingwvars.bat"
set "PATH=%~dp0TDM-GCC-32\bin;%PATH%"
cd /D %1
"%~dp0TDM-GCC-32\bin\g++.exe" %2 -o %3
执行mingwvars.bat
后修改 PATH 。可能是此批处理文件还修改了 PATH 。或者它运行find.exe
之类的命令以及%SystemRoot%\System32
中预期的可执行文件,但也可能存在于目录bin
中。我已经多次看到不能使用登录批处理脚本,因为客户端计算机上的 PATH 包含在第一个文件夹路径中,编译器的bin
目录从Unix移植到Windows,并且可执行文件也可以在{{{ 1}},但是从Unix移植完全不同。
即使文件夹路径包含1个或多个空格,也应将文件夹路径添加到环境变量 PATH ,不带双引号。第三行中使用的双引号只是确保在 PATH 之外不添加尾随空格,并且该命令%SystemRoot%\System32
即使不是典型的文件夹路径(如路径中的&符号)也能正常工作。
应将文件夹路径添加到环境变量 PATH ,而不使用反斜杠。
在命令set
上,如果必须更改不同的驱动器,还会使用参数cd
。如果指定的路径位于不带参数/D
的其他驱动器上,则命令cd
不会更改当前目录。
在C#代码中,您必须确保/D
,workingDir
和fileName
最终在exeName
执行参数字符串中用双引号括起来cmd.exe
cmd
3}}已经写过。
最好在C#应用程序中读取环境变量 ComSpec 的值,并使用此值代替{{1}}来执行批处理文件。
答案 1 :(得分:0)
这可能是,也可能不是问题的一部分,但你不会照顾空间。
pStartInfo.Arguments = string.Join(" ", args);
你可能想要这样的东西:
pStartInfo.Arguments = string.Join(" ", args.Select(x => "\"" + x + "\""));