我如何在我的 .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();
我即将开始使用 CyberSecurity,并在我的计算机上使用一些安全功能。下面是我的批处理文件中用于启用安全协议的示例代码。如果有的话,我将如何用 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 文件中包含小脚本块?