在相对路径中运行批处理文件?

时间:2017-07-08 13:31:32

标签: c# winforms batch-file relative-path

当我按下按钮时,我想运行一个批处理文件。 当我使用绝对(完整)路径时,我的代码工作正常。但是使用相对路径会导致异常。 这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    //x64
    System.Diagnostics.Process batchFile_1 = new System.Diagnostics.Process();
    batchFile_1.StartInfo.FileName = @"..\myBatchFiles\BAT1\f1.bat";
    batchFile_1.StartInfo.WorkingDirectory = @".\myBatchFiles\BAT1"; 
    batchFile_1.Start();
}

和引发的例外:

  

系统找不到指定的文件。

批处理文件的目录是:

C:\Users\GntS\myProject\bin\x64\Release\myBatchFiles\BAT1\f1.bat

输出.exe文件位于:

C:\Users\GntS\myProject\bin\x64\Release

我搜索过,但没有一个结果对我有帮助。在相对路径中运行批处理文件的正确方法是什么?!

2 个答案:

答案 0 :(得分:2)

批处理文件将相对于工作目录(即f1.bat)

但是,您的工作目录应该是绝对路径。无法保证应用程序的当前路径(可以在.lnk中设置)。特别是它不是exe路径。

你应该使用从AppDomain.CurrentDomain.BaseDirectory(或任何其他众所周知的方法)获得的exe文件的路径来构建批处理文件和/或工作目录的路径。

最后 - 使用Path.Combine确定格式正确的路径。

答案 1 :(得分:0)

根据 JeffRSon 的答案和 MaciejLos KevinGosse 的评论,我的问题解决了如下:

string executingAppPath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;

 batchFile_1.StartInfo.FileName = executingAppPath.Substring(0, executingAppPath.LastIndexOf('\\')) + "\\myBatchFiles\\BAT1\\f1.bat";
 batchFile_1.StartInfo.WorkingDirectory = executingAppPath.Substring(0, executingAppPath.LastIndexOf('\\')) + "\\myBatchFiles\\BAT1"; 

另一种方法是:

string executingAppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
batchFile_1.StartInfo.FileName = executingAppPath.Substring(6) + "\\myBatchFiles\\BAT1\\f1.bat";
batchFile_1.StartInfo.WorkingDirectory = executingAppPath.Substring(6) + "\\myBatchFiles\\BAT1"; 

我在这里报告希望帮助某人。