例如我有这段代码:
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文件。
答案 0 :(得分: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文件,运行并删除它。
答案 1 :(得分: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文件。
答案 2 :(得分: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");
答案 3 :(得分:0)
最简单的解决方案是将bat文件添加到Visual Studio中的项目中。为此,请执行以下步骤:
这会将bat fill复制到构建的输出目录中。如果您随后分发程序,则可以发送输出目录。这当然不会阻止用户表单删除bat文件。
另一种选择是将批处理文件作为资源嵌入到项目中并从那里使用它。
答案 4 :(得分:0)
右键单击项目并选择添加现有项目,将dxdiag.bat添加到项目中。然后,在项目中,右键单击dxdiag.bat文件并选择属性。将“复制到输出目录”属性设置为“始终”。
答案 5 :(得分:0)
您可以嵌入.bat文件。当您需要它们时,您会检查这些文件是否存在。如果不是,则将它们从嵌入式资源复制到%appdata%\ YourAppName,然后使用。
如何阅读嵌入资源:How to read embedded resource text file
Microsoft的嵌入资源说明:http://support.microsoft.com/kb/319292