【发布时间】:2013-08-09 16:21:39
【问题描述】:
我正在尝试从我创建的 C# 服务中执行 shell 命令。但是,这个命令似乎没有执行。作为一个标准的控制台应用程序,它可以完美地运行,所以我知道命令本身或者它是如何在代码中执行的形式没有问题。谁能告诉我为什么这行不通?请记住,我对 C# 还很陌生,所以这可能只是我缺乏经验的问题。以下是服务本身的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading;
namespace AdapterDisableTest
{
class Program : ServiceBase
{
//private static Timer workTimer;
static void Main(string[] args)
{
ServiceBase.Run(new Program());
}
public Program()
{
this.ServiceName = "AdapterDisableTest";
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
Process myProcess = new Process();
myProcess.StartInfo.FileName = @"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe";
myProcess.StartInfo.Arguments = "controlvm test setlinkstate1 off";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();
}
protected override void OnStop()
{
base.OnStop();
//TODO: clean up any variables and stop any threads
}
}
}
【问题讨论】:
-
您正在启动的进程是交互式的(即它是否有 UI?)。如果是这样,那就是个坏消息 - 检查这个类似的线程,其中链接了一些很好的信息stackoverflow.com/questions/4147821/…
-
顺便说一句,如果它是一个交互式进程,您仍然可以从服务启动它,但它需要使用 Win32 API,而不是使用 .Net 中内置的
Process功能。 -
不,我尝试运行的应用程序没有 GUI(VirtualBox 本身确实有一个 GUI,但这个实用程序是纯粹的 cli 驱动的)。我不完全确定您所说的交互式服务是什么意思,但我可以告诉您,该应用程序接受参数,立即执行它们,然后在这样做之后自行终止,所有这些都在命令提示符下进行。我假设这是您需要确定的?
-
可能值得将工作目录添加到进程的
StartInfo,因为从服务启动进程时起始文件夹的行为不同 - 尝试设置StartInfo.WorkingDirectory = @"C:\Program Files\Oracle\VirtualBox"看看会发生什么。跨度> -
好主意,但不幸的是也没有用。