winforms 我怎样才能添加一些 bat 文件到我的项目,所以我将不再需要他们在硬盘上?

9vw9lbht  于 2023-08-07  发布在  其他
关注(0)|答案(7)|浏览(101)

例如,我有这样的代码:

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();

字符串
我做了一个测试,如果我删除文件dxdiag.bat从我的项目\调试目录im得到一个异常行:

proc.Start();


文件未找到。一旦文件位于\debug目录中,它就可以工作了。
我想添加dxdiag.bat文件到我的项目,所以如果我发送给别人我的程序,他将能够运行我的程序和进程将运行dxdiag.bat从程序本身,所以我发送的程序不会需要 bat 文件在他自己的硬盘上。

ulmd4ohb

ulmd4ohb1#

只要没有变量或非单行命令,就可以对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 文件,运行它并删除它。

jvidinwx

jvidinwx2#

最简单的解决方案是将bat文件添加到Visual Studio中的项目中。要执行此操作,请执行以下步骤:
1.将bat文件复制到保存项目的目录中。
1.将文件添加到项目中。
1.将属性“生成操作”设置为“内容”。
1.将属性“复制到输出目录”设置为“始终复制”。
这将把 bat 填充复制到构建的输出目录。如果你分发你的程序,你可以发送输出目录。这当然不会阻止用户删除bat文件。
另一种选择是将批处理文件作为资源嵌入到项目中,并从那里使用它。

iklwldmw

iklwldmw3#

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

x6yk4ghg

x6yk4ghg4#

您要做的是按照coshmos的建议将.bat文件作为嵌入资源嵌入。为此,您需要在解决方案资源管理器中右键单击.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文件。

g52tjvyc

g52tjvyc5#

// 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");

字符串

zd287kbt

zd287kbt6#

您可以嵌入.bat文件。当你需要它们时,你检查这些文件是否存在。如果没有,请将它们从嵌入资源复制到%appdata%\YourAppName,然后使用。
如何读取嵌入式资源:How to read embedded resource text file
来自Microsoft的嵌入式资源的说明:http://support.microsoft.com/kb/319292

t5fffqht

t5fffqht7#

属性,并设置以下内容
将属性“生成操作”设置为“内容”。将属性“复制到输出目录”设置为“始终复制”。

相关问题