使用C#中的同一ProcessStartInfo实例执行多个命令(使用BCP)

本文关键字:使用 命令 BCP 执行 实例 ProcessStartInfo | 更新日期: 2023-09-27 18:24:44

我知道我的标题似乎和StackOverflow中的其他标题一样,但我的意图是其他的。

我创建了一个C#函数,它使用BCP命令为数据库中的每个表创建BCP文件。下面的代码是一个示例,是函数的一部分。

List<string> tables = GetTables(); // a function which takes all tables from my database
string command = @"bcp ADatabase.dbo.{0} out {0}.bcp -n -Usa -Ppassword";
ProcessStartInfo processInfo = null;
     try {
        foreach ( string table in tables ) {
           command = string.Format( command, table );
           processInfo = new ProcessStartInfo( "cmd", "/c " + command );
           processInfo.RedirectStandardOutput = true;
           processInfo.CreateNoWindow = false;
           Process process = new Process();
           process.StartInfo = processInfo;
           process.Start();
           string result = process.StandardOutput.ReadToEnd();
           Console.WriteLine( result );
        }
     } catch ( Exception e ) {
        Console.WriteLine( e.Message );
     }

我想避免执行多个窗口,我想在同一个窗口中执行每个命令行。

我的代码是好的还是替代的?

感谢

使用C#中的同一ProcessStartInfo实例执行多个命令(使用BCP)

我不确定是否有办法打开一个命令窗口,然后继续向它发布命令,如果有人能聪明地做到这一点,那就太好了。

您可以使用Streamwriter编写一个包含所有所需命令的批处理文件,然后运行该批处理文件。这至少只能开启一个进程。

StreamWriter sw = new StreamWriter("MyBatchFile.bat");
            string command = @"bcp ADatabase.dbo.{0} out {0}.bcp -n -Usa -%1";
            ProcessStartInfo processInfo = null;
            try
            {
                foreach (string table in tables)
                {
                    command = string.Format(command, table);
                    sw.WriteLine(command);                                        
                }
                sw.Flush();
                sw.Close();
                processInfo = new ProcessStartInfo("cmd", "/c MyBatchFile.Bat Ppassword");
                processInfo.RedirectStandardOutput = true;
                processInfo.CreateNoWindow = false;
                Process process = new Process();
                process.StartInfo = processInfo;
                process.Start();
                string result = process.StandardOutput.ReadToEnd();
                Console.WriteLine(result);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

批处理文件的命令行中有"%1",因此当您启动进程时,您可以将数据库的密码传递给批处理文件

ProcessStartInfo("cmd", "/c MyBatchFile.Bat Ppassword");

这应该确保,如果有人找到了批处理文件,它只有密码所在的%1。

不确定这是否比你已经拥有的更好。。。但它只打开一个命令窗口:)

Martyn

一个非常简单的选项是使用&&运算符构建一个巨大的命令。这里有一个片段来说明这个想法:cmd /c echo hello && echo world。这里的缺点是,如果你的任何一项任务失败了,就有点难弄清楚是哪一项。

您可以始终将命令写入本地*.bat文件,然后处理该文件。然后,如果其中一个失败,您可以更好地了解它在哪里失败,并且您希望将cmd参数从/c切换到/k,这样您就可以打开窗口查看发生了什么。