如何将一些bat文件添加到我的项目中,以便我不再需要它们在硬盘上?

时间:2013-07-26 05:59:40

标签: c# winforms

例如我有这段代码:

Process proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = "dxdiag.bat";
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
proc.Close();

如果我从我的项目\ debug目录中删除文件dxdiag.bat我做了一个测试我在行上获得了一个异常:

proc.Start();

找不到该文件。 一旦文件在\ debug目录下工作。

我想将dxdiag.bat文件添加到我的项目中,所以如果我向其他人发送我的程序,他将能够运行我的程序,并且该过程将从程序中运行dxdiag.bat,这样我发送的程序该程序不需要在自己的硬盘上使用bat文件。

6 个答案:

答案 0 :(得分:3)

只要您没有变量或非单行命令,就可以使用bat文件的每一行运行此函数

    internal static void executeCommand(string command, bool waitForExit,
    bool hideWindow, bool runAsAdministrator)
    {
        System.Diagnostics.ProcessStartInfo psi =
        new System.Diagnostics.ProcessStartInfo("cmd", "/C " + command);

        if (hideWindow)
        {
            psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        }

        if (runAsAdministrator)
        {
            psi.Verb = "runas";
        }

        if (waitForExit)
        {
            System.Diagnostics.Process.Start(psi).WaitForExit();
        }
        else
        {
            System.Diagnostics.Process.Start(psi);
        }
    }

所以你也可以在代码中保存文本

string bat_file = @"@echo off\ncopy c:\users\Desktop\filea.txt c:\users\Desktop\fileb.txt\n...";

否则我会创建一个临时的bat文件,运行并删除它。

答案 1 :(得分:1)

您要做的是将.bat文件作为嵌入式资源嵌入,如coshmos建议的那样。要执行此操作,您需要右键单击解决方案资源管理器中的.bat文件,选择属性,然后在“构建操作”部分下选择“嵌入式资源”。之后,假设您的bat文件位于程序的根目录中,以下代码应该起作用:

string batFileName = "dxdiag.bat";
string programName = Assembly.GetExecutingAssembly().GetName().Name;

using (Stream input = Assembly.GetExecutingAssembly().GetManifestResourceStream(programName + "." + batFileName))
{
    using (TextReader tr = new StreamReader(input))
    {
        File.WriteAllText(batFileName, tr.ReadToEnd());
    }
}


Process proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = batFileName;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
proc.Close();

此代码的前半部分将bat文件从嵌入式资源中拉出,并将其作为实际但临时的bat文件保存在程序根目录中。之后,它与您的代码基本相同。

此外,如果您在此代码之后添加File.Delete(batFileName);,它将自动删除它创建的临时bat文件。

答案 2 :(得分:0)

// create the dxdiag.bat file 
using (StreamWriter sw = new StreamWriter("dxdiag.bat"))
{
   sw.WriteLine(".........");
   // ......
}

Process proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = "dxdiag.bat";
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
proc.Close();

//delete the file 
File.Delete("dxdiag.bat");

答案 3 :(得分:0)

最简单的解决方案是将bat文件添加到Visual Studio中的项目中。为此,请执行以下步骤:

  1. 将bat文件复制到包含项目的目录。
  2. 将文件添加到项目中。
  3. 将属性“Build Action”设置为“Content”。
  4. 将属性“复制到输出目录”设置为“始终复制”。
  5. 这会将bat fill复制到构建的输出目录中。如果您随后分发程序,则可以发送输出目录。这当然不会阻止用户表单删除bat文件。

    另一种选择是将批处理文件作为资源嵌入到项目中并从那里使用它。

答案 4 :(得分:0)

右键单击项目并选择添加现有项目,将dxdiag.bat添加到项目中。然后,在项目中,右键单击dxdiag.bat文件并选择属性。将“复制到输出目录”属性设置为“始终”。

答案 5 :(得分:0)

您可以嵌入.bat文件。当您需要它们时,您会检查这些文件是否存在。如果不是,则将它们从嵌入式资源复制到%appdata%\ YourAppName,然后使用。

如何阅读嵌入资源:How to read embedded resource text file
Microsoft的嵌入资源说明:http://support.microsoft.com/kb/319292