从C#应用程序运行多个命令

时间:2015-09-03 13:52:36

标签: c# command-line

我想通过C#应用程序运行几个命令,如

以前我有一个批处理文件,我使用C#运行它,但现在很少有命令可以接受输入。但是怎么做呢?

我试过

 Process cmdprocess = new Process();
        ProcessStartInfo startinfo = new ProcessStartInfo();
        Environment.SetEnvironmentVariable("filename", FileName);
        startinfo.FileName = @"C:\Users\cnandy\Desktop\St\2nd Sep\New_CN\New folder\Encrypt web.config_RSAWebFarm\Decrypt Connection String.bat";

        startinfo.WindowStyle = ProcessWindowStyle.Hidden;
        startinfo.CreateNoWindow = true;
        startinfo.RedirectStandardInput = true;
        startinfo.RedirectStandardOutput = true;
        startinfo.UseShellExecute = false;
        cmdprocess.StartInfo = startinfo;
        cmdprocess.Start();

在批处理文件中

cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319

aspnet_regiis -pi "CustomKeys2" "C:\Users\cnandy\Desktop\Encryption_keys\CustomEncryptionKeys.xml"

aspnet_regiis -pa "CustomKeys2" "NT AUTHORITY\NETWORK SERVICE"

aspnet_regiis -pdf "connectionStrings" %filename%

但实际上他们根本没有被执行。如何实现相同的最后一个命令,我可以接受输入而不是硬编码

"C:\Users\cnandy\Desktop\Test\Websites\AccountDeduplicationWeb"

3 个答案:

答案 0 :(得分:3)

试试这个:

Process p = new Process()  
{
    StartInfo = new ProcessStartInfo("cmd.exe")
    {
       RedirectStandardInput = true,
       RedirectStandardOutput = true,
       UseShellExecute = false,
       CreateNoWindow = true
    }
};

p.Start();

using (StreamWriter sw = p.StandardInput)
{
    sw.WriteLine("First command here");
    sw.WriteLine("Second command here");
}

p.StandardInput.WriteLine("exit");

或者,尝试这种更直接的方式(也实现你要求的最后一件事):

string strEntry = ""; // Let the user assign to this string, for example like "C:\Users\cnandy\Desktop\Test\Websites\AccountDeduplicationWeb"

Process p = new Process()  
{
    StartInfo = new ProcessStartInfo("cmd.exe")
    {
       RedirectStandardInput = true,
       RedirectStandardOutput = true,
       UseShellExecute = false,
       CreateNoWindow = true
    }
};

p.Start();

p.StandardInput.WriteLine("cd C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319");
p.StandardInput.WriteLine("aspnet_regiis -pi \"CustomKeys2\" \"C:\\Users\\cnandy\\Desktop\\Encryption_keys\\CustomEncryptionKeys.xml\"");
p.StandardInput.WriteLine("aspnet_regiis -pa \"CustomKeys2\" \"NT AUTHORITY\\NETWORK SERVICE\"");
p.StandardInput.WriteLine("aspnet_regiis -pdf \"connectionStrings\" " +  strEntry);

p.StandardInput.WriteLine("exit"); //or even p.Close();

如果使用第二种方式,建议让用户在文本框中输入路径,然后从文本框的Text属性中获取字符串,其中将自动附加所有必要的额外反斜杠。

应该提到的是,没有cmd会显示运行批处理文件或命令。

答案 1 :(得分:1)

使用Process对象启动批处理文件。您可以使用环境变量在进程之间传递值。在这种情况下,从C#到bat文件,您可以使用环境变量传递值。

C#

Environment.SetEnvironmentVariable("searchString","*.txt")

在bat文件中,您可以访问该值,如下所示

dir %searchString%

从c#

启动bat文件
System.Diagnostics.Process.Start("path\commands.bat");

使用批处理文件和变量

从C#启动记事本的示例代码
System.Environment.SetEnvironmentVariable("fileName", "test.txt");
System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "/commands.bat");
Console.ReadLine();

Bat文件

@echo "staring note pad"
notepad %fileName%

答案 2 :(得分:1)

您仍然可以像以前一样制作批处理文件。只需要改变它就是接受变量。

这样的东西
 CallYourBatch.bat "MyFileName"

然后在批处理文件中,您可以接受参数

SET fileName=%~1
aspnet_regiis -pdf "connectionStrings" %fileName%

类似地,在形成命令文本时可以使用相同的功能,如果您必须将其作为C#代码的一部分来使用。

我也可以建议使用CALL命令来调用批处理文件吗?有关相同内容的更多信息,请访问http://ss64.com/nt/call.html