Выполнить несколько команд (используя BCP) с тем же экземпляром ProcessStartInfo в C # - PullRequest
0 голосов
/ 15 февраля 2012

Я знаю, что мой заголовок похож на других из 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 );
     }

Я хочу избежать выполнения нескольких окон и хочу выполнить каждую командную строку в одном и том же окне.

Мой код хорош или является альтернативой?

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Я не уверен, есть ли способ открыть одно командное окно и затем продолжать публиковать в нем свои команды, было бы неплохо, если бы у кого-то был умный способ сделать это.

Вы можете использовать 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

0 голосов
/ 15 февраля 2012

Действительно простой вариант - создать огромную команду с помощью оператора &&.Вот фрагмент для иллюстрации идеи: cmd /c echo hello && echo world.Недостатком здесь является то, что если какая-либо из ваших задач не выполняется, то сложно определить, какая из них.

Вы всегда можете записать команды в локальный файл * .bat и обработать этот файл.Затем, если произойдет сбой, вы лучше поймете, где он произошел, и вы захотите переключить параметр cmd с /c на /k, чтобы вы могли оставить окно открытым, чтобы увидеть, что произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...