0

我正在尝试从远程机器重新启动服务。这是我的代码。问题是我需要输入,startinfo.filename = "sc.exe"因为我输入"start /wait sc"这会导致错误。这是我的代码,任何想法。此外,如果有人知道如何在运行后保持 cmd 窗口打开,那么我可以看到运行的代码会很棒。

string strCommandStop1;
string strCommandStop2;
string strCommandStart1;
string strCommandStart2;
string strServer = "\\" + txtServerName.Text;
string strDb1 = "SqlAgent$" + txtInsName.Text;
string strDb2 = "MSSQL$" + txtInsName.Text;

strCommandStop1 = @"start /wait sc " + strServer + " Stop " + strDb1;
strCommandStop2 = @"start /wait sc " + strServer + " Stop " + strDb2;
strCommandStart1 = @"start /wait sc " + strServer + " Start " + strDb2;
strCommandStart2 = @"start /wait sc " + strServer + " Start " + strDb1;

try
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = true;

    startInfo.Arguments = strCommandStop1;
    startInfo.Arguments = strCommandStop2;
    startInfo.Arguments = strCommandStart1;
    startInfo.Arguments = strCommandStart2;
    startInfo .FileName = "sc.exe";

    Process.Start(startInfo);

}
catch (Exception e)
{
    MessageBox.Show(e.Message);
}
4

5 回答 5

3

为什么不使用ServiceController类?这样你就可以更好地控制正在发生的事情。

于 2009-07-31T12:32:10.543 回答
0

"start" 是 cmd.exe shell 中的一个内在命令,所以使用 cmd.exe 作为文件名;

ProcessStartInfo si = new ProcessStartInfo();
si.CreateNoWindow = true;
si.Arguments = "/c start /wait sc.exe " + server + " Stop " + database;
si.FileName = "cmd.exe";
Process.Start(si);

此外,您对 Arguments 属性的连续重新分配看起来很奇怪。您需要为要执行的每个命令行调用 Process.Start。

于 2009-07-31T12:27:03.427 回答
0

我认为您的问题是您的 startInfo 对象将实际调用:

sc.exe start /wait sc <strServer> Start <strDb1>

此外,您是否有特殊要求必须使用 sc 而不是使用 System.ServiceProcess 库中的 ServiceController 类?

于 2009-07-31T12:30:25.613 回答
0

感谢我使用 ServiceController 类的每个人,这让一切变得更加容易。感谢你的帮助。Ĵ

于 2009-08-04T12:09:20.597 回答
0

如果您使用 cmd /k 并且没有似乎打开新 cmd 的 start ,控制台可以保持打开状态。所以它应该类似于 cmd /k sc.exe " + server + " Stop " + database;

于 2010-06-11T09:07:09.877 回答