我如何在我的 .exe 中包含批处理文件而不是在 .exe 所在的文件夹中需要它们

How do i include batch files inside of my .exe Instead of needing them in the folder the .exe is located in

一直在搜索或上网,但似乎找不到对我有帮助的答案。我已经找了将近一个星期了。

我在 vs 中创建了一个程序,还有一些批处理文件。批处理文件 运行 本身很棒,通过 debug/release 将它们包含在带有 .exe 的文件夹中。

我的问题是我希望只能从我的版本中获得 .exe 文件并且它仍然有效。

有没有办法在 .exe 中构建这些文件?我尝试使用 c# 编写我的控制台命令,而不是包含单独的批处理文件。但是我对 c# 还是个新手,除了我想要 run/if 我 运行 很多行的命令错误,我什么也没得到。

我宁愿只使用 c# 而不是包含批处理文件,但我似乎无法找出解决方案。

如有任何帮助,我们将不胜感激。

这是我目前调用的批处理文件,效果很好。同样,如果有一种方法可以用 c# 编写而不是调用批处理文件,我会很乐意学习。

  Process process = new Process();
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.CreateNoWindow = false;
            psi.Verb = "runas";
            psi.FileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"/" + "undo.bat";
            psi.UseShellExecute = true;
            process.StartInfo = psi;
            _ = process.Start();
            process.WaitForExit();

我很快就要开始使用 Cyber​​Security 并在我的计算机上尝试一些安全方面的东西。下面是我的批处理文件中用于启用安全协议的示例代码。如果有的话,我将如何用 C# 编写它?

echo ...
echo Enabling Windows Firewall

netsh advfirewall set allprofiles state on
echo Enalbing HyperVisor

bcdedit /set hypervisorlaunchtype auto

echo Enabling UAC

%windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 1 /f
echo.
echo.
echo Your Computer will now be restarting for changes to take effect! 

timeout 10
shutdown /r /t 001

您可以做的是将批处理文件作为嵌入式资源包含在您的项目中。然后读取它们,然后执行它们。

将它们作为嵌入式资源示例包含在内...

  1. 将它们添加到您的项目中。
  2. 右键单击并转到属性
  3. select 内嵌资源

然后提取...

Write file from assembly resource stream to disk

然后您可以将文件写入磁盘并在其上创建进程。或者有一种方法可以在不将文件写入磁盘的情况下执行 cmd.exe 但这有点复杂,所以最好的方法就是只写入磁盘。

Execute BATCH script in a programs memory

我按照上面给出的指南和其他一些指南来使我的解决方案起作用。嵌入解决方案中的资源,然后我使用以下代码几乎创建了能够编写它的功能。

private static void Extract(string nameSpace, string outDirectory, string internalFilePath, string resourceName) 
        {

            Assembly assembly = Assembly.GetCallingAssembly();

            using (Stream s = assembly.GetManifestResourceStream(nameSpace + "." + (internalFilePath == "" ? "" : internalFilePath + ".") + resourceName)) 
                using (BinaryReader r = new BinaryReader(s))
                    using (FileStream fs = new FileStream(outDirectory + "//" + resourceName, FileMode.OpenOrCreate))
                        using (BinaryWriter w = new BinaryWriter(fs))
                            w.Write(r.ReadBytes((int)s.Length));

        }

这是我用来保存,执行然后删除文件的。

    Extract("nameSpace", "outDirectory", "internalFilePath", "resourceName");
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.CreateNoWindow = false;
    psi.Verb = "runas";
    psi.FileName = @"C:/" + "resourceName";
    psi.UseShellExecute = true;
    process.StartInfo = psi;
    _ = process.Start();
    process.WaitForExit();
    System.Threading.Thread.Sleep(10);

    if ((System.IO.File.Exists(psi.FileName)))
    {
        System.IO.File.Delete(psi.FileName);
    }

请记住我是新手,所以我确信有更好的写法,但这对我有用!