0

例如我有这个代码:

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文件。

4

6 回答 6

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 文件,运行它并删除它。

于 2013-07-26T06:26:11.210 回答
1

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

  1. 将 bat 文件复制到保存项目的目录中。
  2. 将文件添加到项目中。
  3. 将属性“构建操作”设置为“内容”。
  4. 将属性“复制到输出目录”设置为“始终复制”。

这会将 bat 填充复制到构建的输出目录。如果您随后分发您的程序,您可以发送输出目录。当然,这不会阻止用户删除 bat 文件。

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

于 2013-07-26T06:20:17.413 回答
1

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

于 2013-07-26T06:22:23.950 回答
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 文件。

于 2013-07-26T06:53:15.010 回答
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");
于 2013-07-26T06:14:36.943 回答
0

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

如何读取嵌入式资源:如何读取嵌入式资源文本文件
来自 Microsoft 的嵌入式资源说明:http: //support.microsoft.com/kb/319292

于 2013-07-26T06:24:23.070 回答