使用.Net win表单中的cmd.exe在命令行实用程序中运行多个命令

本文关键字:运行 命令行 实用程序 命令 exe win Net 表单 cmd 使用 | 更新日期: 2023-09-27 17:59:45

我想运行tabcmd.exe实用程序在tableau服务器中发布视图。手动步骤如下,位置中的每一步都会更新日志文件

"C:''Users[UserName]''AppData''Roaming''Tableau''tabcmd.log"

在同一个会话中,我必须手动执行这些步骤,一个接一个订单

  1. 运行cmd.exe
  2. 使用命令登录tabcmd login-s"http://sales-server:8000"-t sales-u administrator-p p@ssw0rd
  3. 使用命令创建项目名称tabcmd createproject-n"Quarterly_Reports"-d"显示季度销售报告的工作簿"。
  4. 使用命令发布视图tabcmd Publish"analysis.twbx"-n"Sales_analysis"--db user"jsmith"--db password"p@ssw0rd"
  5. 使用命令刷新tabcmd refreshextracts--工作簿"我的工作簿"
  6. 使用命令退出tabcmd logout

现在我正试图从我的.Net win表单中自动执行这些步骤,所以我使用了下面的代码作为尝试,但它不起作用。

String path = @"C:'Program Files (x86)'Tableau'Tableau Server'7.0'bin'tabcmd.exe"
ProcessStartInfo startInfo = new ProcessStartInfo ();
startInfo.FileName = "'""+path+ "'"";
startInfo.Arguments = String.Format("login -s http://Server1:8000 --db-user "jsmith" --db-password "p@ssw0rd");
startInfo.UseShellExecute = false ;
startInfo.CreateNoWindow = false;
startInfo.WindowStyle = ProcessWindowStyle.Normal;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
Process p = new Process();
p.StartInfo = startInfo;
p.Start();      

using (StreamWriter sw = p.StandardInput)
        {
            if (sw.BaseStream.CanWrite)
            {
                sw.WriteLine("createproject -n '"MyProject'" -d '"MyProjectWorkbook'"");
                //sw.WriteLine("My next Command");
                //sw.WriteLine("My next Command");
            }
        }  

我能够成功登录,但我无法进一步进行后续步骤,我不知道如何进一步进行,所以我期待着在这方面得到一些帮助。提前感谢!

使用.Net win表单中的cmd.exe在命令行实用程序中运行多个命令

我不确定这是否对你有用,但你可以尝试用所有这些命令创建一个批处理文件,并从命令提示符执行批处理文件:-

  //Build Commands - You may have to play with the syntax
    string[] cmdBuilder = new string[5] 
      { 
       @"tabcmd login -s 'http:/sales-server:8000' -t Sales -u administrator -p p@ssw0rd!",
       @"tabcmd createproject -n 'Quarterly_Reports' -d 'Workbooks showing quarterly sales reports.'",
       @"abcmd publish 'analysis.twbx' -n 'Sales_Analysis' --db-user 'jsmith' --db-password 'p@ssw0rd'", 
       @"tabcmd refreshextracts workbook 'My Workbook'",
       @"tabcmd logout"
      };

     //Create a File Path
    string BatFile = @"'YourLocation'tabcmd.bat";
    //Create Stream to write to file.
    StreamWriter sWriter = new StreamWriter(BatFile);
     foreach (string cmd in cmdBuilder) 
        { 
          sWriter.WriteLine(cmd); 
        }
       sWriter.Close();
    //Run your Batch File & Remove it when finished.

   Process p = new Process();
   p.StartInfo.CreateNoWindow = true;
   p.StartInfo.UseShellExecute = false;
   p.StartInfo.FileName = "C:''cmd.exe";
   p.StartInfo.Arguments = @"'YourLocation'tabcmd.bat";
   p.Start();
   p.WaitForExit();
   File.Delete(@"'YourLocation'tabcmd.bat")

我将把输出部分留给你自己。你可以试试这个,它并不完全干净,但会自动执行主要步骤。是这样,还是在最后一个进程退出时为每个命令打开一个进程?

希望这能有所帮助。