【问题标题】:Executing command-prompt command in C#在 C# 中执行命令提示符命令
【发布时间】:2011-10-26 11:33:22
【问题描述】:

:)

我有一个可以通过命令行执行的软件,现在我希望它可以直接从我的 C# 应用程序中执行。可悲的是,没有错误,但我仍然做不到。 :(

软件的.exe文件路径为C:\program files\mysoftware.exe

我想输入的命令是 cd c:\程序文件\mysoftwareFolder 进入 mysoftware.exe d:\myfolder\file1.xxx d:\myfolder\file2.xxx -mycommand 进入 退出

上面的命令在实际的命令提示符下运行得很好,但它们在我的 C# 代码中不起作用。

代码如下:

        Process cmdprocess = new Process();
        System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo();
        startinfo.FileName = "cmd";
        startinfo.WindowStyle = ProcessWindowStyle.Hidden;
        startinfo.CreateNoWindow = true;
        startinfo.RedirectStandardInput = true;
        startinfo.RedirectStandardOutput = true;
        startinfo.UseShellExecute = false;
        cmdprocess.StartInfo = startinfo;
        cmdprocess.Start();
        System.IO.StreamReader sr = cmdprocess.StandardOutput;
        System.IO.StreamWriter sw = cmdprocess.StandardInput;
        sw.WriteLine(@"echo on");
        sw.WriteLine(@"c:");
        sw.WriteLine(@"cd" +@"program files\mysoftwarefolder");
        sw.WriteLine(@"mysoftware.exe" +@"d:\myfolder\file1.xxx" +@"d:\myfolder\file2.xxx" +@"-mycommand");
        sw.WriteLine(@"exit");
        sw.Close();
        sr.Close();

我猜不正确的部分可能是 "startinfo.FileName = "cmd";"或者我在代码中键入命令的方式,但我不知道如何更正它们。 :(

请告诉我我做错了什么。我很感激你的每一个回答! :)))

更新感谢您的帮助!我尝试在批处理文件中编写命令,但它只能在调试模式下工作。 (我忘了告诉你们我正在开发一个 Web 服务。)当我运行将使用这个 C# 服务的外部项目时,它不会工作。我不知道我是否应该在我的代码中添加一些东西。

帮助meeeeee pleaseeeee (T___T)

【问题讨论】:

  • 查看连接字符串的方式。例如,当我认为你想要这个"cd program files\mysoftwarefolder" 时,这个@"cd" +@"program files\mysoftwarefolder" 会得到你这个"cdprogram files\mysoftwarefolder"。注意空间。

标签: c# command-line command-prompt


【解决方案1】:

将这些命令写入一个批处理文件并执行该批处理文件。

在批处理文件中:

cd c:\program files\mysoftwareFolder 
mysoftware.exe
d:\myfolder\file1.xxx
d:\myfolder\file2.xxx -mycommand 
exit

代码:

Process cmdprocess = new Process();
ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = "path to batchfile.bat";
startinfo.WindowStyle = ProcessWindowStyle.Hidden;
startinfo.CreateNoWindow = true;
startinfo.RedirectStandardInput = true;
startinfo.RedirectStandardOutput = true;
startinfo.UseShellExecute = false;
cmdprocess.StartInfo = startinfo;
cmdprocess.Start();

【讨论】:

  • @Oded- 他可能还想将他的文件名作为选项传递给批处理文件。
【解决方案2】:

代替:

startinfo.FileName = "cmd";

直接使用

startinfo.FileName = @"c:\program files\mysoftwarefolder\mysoftware.exe";

然后将参数传递给起始信息

startinfo.Arguments = @"d:\myfolder\file1.xxx " +@"d:\myfolder\file2.xxx " +@"-mycommand";

所以整个代码看起来像:

        Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.FileName = @"c:\program files\mysoftwarefolder\mysoftware.exe";
        p.StartInfo.Arguments = @"d:\myfolder\file1.xxx " +@"d:\myfolder\file2.xxx " +@"-mycommand";
        p.Start();
        string output = p.StandardOutput.ReadToEnd();
        p.WaitForExit();

如果您需要查看程序的输出,您可以简单地使用输出字符串。

【讨论】:

    【解决方案3】:

    两件事:我认为您有间距问题并且您没有阅读这些命令的结果。 cmd 可能会告诉你……“不被识别为内部或外部命令”

    如果你看看你在 cmd 上抛出了什么,它会是:

    回显

    c:

    cdprogram files\mysoftware 文件夹

    mysoftware.exed:\myfolder\file1.xxx

    当你在 cmd 中尝试时,这将不起作用。 CMD 几乎肯定会向您发送错误消息,但您从不阅读 sr ,因此您永远不会知道它。 我会添加一些空格并在内部将所有路径包含在引号中,如下所示:

    sw.WriteLine(@"echo on");
    sw.WriteLine(@"c:");
    sw.WriteLine("cd \"program files\\mysoftwarefolder\"");
    sw.WriteLine("mysoftware.exe \"d:\\myfolder\\file1.xxx\" d:\\myfolder\\file2.xxx\" -mycommand");
    sw.WriteLine(@"exit");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-03
      • 2013-08-01
      • 2012-11-23
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多