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

Posted

技术标签:

【中文标题】我如何在我的 .exe 中包含批处理文件而不是在 .exe 所在的文件夹中需要它们【英文标题】:How do i include batch files inside of my .exe Instead of needing them in the folder the .exe is located in 【发布时间】:2021-04-24 20:37:27 【问题描述】:

所以一直在搜索或上网,但似乎找不到对我有帮助的答案。我已经找了快一周了。

我在 vs 中创建了一个程序,以及一些批处理文件。将批处理文件包含在带有 .exe 的文件夹中时,它们可以自行运行,并且可以通过调试/发布运行。

我的问题是我希望能够只拥有我发布的 .exe 文件并且它仍然可以工作。

有没有办法可以在 .exe 中构建这些文件?我尝试使用 c# 编写控制台命令,而不是包含单独的批处理文件。但我对 c# 很陌生,除了我想运行的命令/如果我运行多行时出现错误,我什么也得不到。

我宁愿只使用 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

【问题讨论】:

您可以尝试通过 StandardInput 将它们提供给 cmd 进程。 示例:void runBatchFromText(string txt) ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = @"cmd.exe"; // Specify exe name. startInfo.UseShellExecute = false; startInfo.ErrorDialog = false; startInfo.RedirectStandardInput = true; Process process = Process.Start(startInfo); string[] batchFile = txt.Replace("\r\\n", "\r").Split('\r'); int cmdIndex = 0; while (!process.HasExited) if (process.Threads.Count == 1 && cmdIndex < batchFile.Length) process.StandardInput.WriteLine(batchFile[cmdIndex++]); 我试过你给定的例子,它给出了一个错误,说 .txt 不在当前上下文中。我需要声明别的东西吗?这只是调用现有的批处理文件吗? 如果我放弃批处理文件的想法并使用 write.line 怎么办?我只是对此还不熟悉 docs.microsoft.com/en-us/windows/win32/menurc/…。您在应用程序的资源中编译文本。或者更容易让您的程序从常量写入磁盘。 【参考方案1】:

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

将它们作为嵌入式资源示例...

    将它们添加到您的项目中。 右键单击并转到属性 选择嵌入资源

然后提取...

Write file from assembly resource stream to disk

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

Execute BATCH script in a programs memory

【讨论】:

所以这肯定会有所帮助,但我不确定如何实现这一点,因为我对这一切还很陌生。所以我将它们添加为嵌入文件。现在将它们骑到我磁盘上的空间我会使用这样的东西吗? File.WriteAllBytes(@"C:\ResourceName", (byte[])Resources.resourcename);这虽然行不​​通。一旦写好,我就可以像以前一样调用它。但是一旦完成,我将如何在使用完成后终止文件?【参考方案2】:

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

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

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

【讨论】:

以上是关于我如何在我的 .exe 中包含批处理文件而不是在 .exe 所在的文件夹中需要它们的主要内容,如果未能解决你的问题,请参考以下文章

使用 cx_Freeze - 如何在 .exe 中包含所有必要的文件?

如何在我的文件转换脚本中包含子文件夹?

如何在单独的 js 文件中使用访问 django 模板变量,而不是在同一个 html 文件中包含小脚本块?

如何在 C# 中启动我的项目中包含的 .exe 文件? [复制]

在异常日志记录中包含“应用程序名称”

在主要目标中包含 pod,而不是在 WatchKit 扩展中