我知道我的标题似乎与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 );
}
我想避免执行多个窗口,我想在同一窗口中执行每个命令行。
我的代码是好还是替代?
由于
答案 0 :(得分:2)
我不确定是否有办法打开一个命令窗口,然后继续发布命令,如果有人聪明地这样做会很好。
您可以使用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。
不确定这是否比你已经更好......但它只打开一个命令窗口:)
马丁
答案 1 :(得分:0)
一个非常简单的选择是使用&&
运算符构建一个庞大的命令。这是一个说明这个想法的片段:cmd /c echo hello && echo world
。这里的缺点是,如果你的任何任务失败,找出哪一个有点困难。
您始终可以将命令写入本地* .bat文件,然后处理该文件。然后,如果一个失败,您可以更好地了解它失败的位置,并且您希望将cmd参数从/c
切换到/k
,这样您就可以保持窗口打开以查看发生了什么。