【问题标题】:Running a command line exe from windows service从 Windows 服务运行命令行 exe
【发布时间】:2014-04-06 16:10:10
【问题描述】:

我有一个旨在执行以下操作的 Windows 服务:

  1. 监视服务器上的文件夹中的 PDF 文件
  2. 当文件到达时,运行第三方 exe 将 PDF 转换为 Excel。不生成文本输出。第三方工具只需使用输入文件路径并生成输出 excel 文件。无需启动窗口。无需跟踪会话。
  3. Windows 服务然后从 Excel 中读取数据,对其进行处理,并将 xml 输出到文件夹中。

所有这些在调试模式下都可以正常工作。但是,当我尝试在本地计算机上以发布模式(使用 installutil)作为服务(而不是在 Visual Studio 中)运行 Windows 服务时,它不起作用。当我附加到进程时,我注意到光标只是挂在 waitforexit 上并且没有生成 excel。由于它可以在调试模式下工作,但不能在发布模式下工作,我怀疑这是权限问题。任何反馈将不胜感激。

已尝试检查“允许服务与桌面交互”。没有帮助。

编辑:更正 - 光标实际上挂在 exeProcess.WaitForExit()

ProcessStartInfo sInfo = new ProcessStartInfo();
sInfo.FileName = ConfigurationManager.AppSettings["FileName"];
sInfo.Arguments = GetArguments();
sInfo.UseShellExecute = false;
sInfo.CreateNoWindow = true;
sInfo.ErrorDialog = false;
sInfo.WindowStyle = ProcessWindowStyle.Hidden;
//sInfo.RedirectStandardError = true;  //didn't work
//sInfo.RedirectStandardInput = true;  //didn't work
//sInfo.RedirectStandardOutput = true;  //didn't work


using (Process exeProcess = Process.Start(sInfo))
{
    //StreamWriter inputWriter = exeProcess.StandardInput;
    //StreamReader outputReader = exeProcess.StandardOutput;
    //StreamReader errorReader = exeProcess.StandardError;
    exeProcess.WaitForExit();
}

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @RickS,在发布问题之前,我已经浏览了这些链接。您对将 Topshelf 与控制台应用程序一起使用有什么建议,以便控制台应用程序可以调用第三方 exe 并将 PDF 文件名传递给它。这行得通吗?
  • 是否有任何理由等待命令行实用程序退出?如果您查看即将到来的 pdf 文件的文件夹,那么您可以运行该工具并让它完成工作。并且在一段时间后或通过另一个观察者的通知来处理 excel 文件。

标签: c# .net process windows-services processstartinfo


【解决方案1】:

我会在代码中放入适当的异常处理和日志记录到例如事件日志以找出是否有任何与预期不同的地方。

下一步可能是使用您知道将有权访问您尝试运行的可执行文件、导出生成的文件的目录等的凭据配置服务。

如果可能/可用,请尝试使用您可以引用的程序集,而不是从您的代码中运行另一个可执行文件。这样你就可以更好地控制它;)

编辑: 通常可以通过 windows 服务运行命令行工具。只需要清楚工具期望如何获取数据,如果它来自命令行并且工具不等待用户输入任何内容。您是否只是使用此命令行实用程序或一般情况下有问题?

服务:

private FileSystemWatcher watcher;

public Service1()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    watcher = new FileSystemWatcher();
    watcher.Path = @"c:\temp\service";
    watcher.Created += watcher_Created;
    watcher.EnableRaisingEvents = true;

}

protected override void OnStop()
{
}

private void watcher_Created(object sender, FileSystemEventArgs e)
{
    try
    {
        ProcessStartInfo startInfo = new ProcessStartInfo(pathToExe, e.Name);
        EventLog.WriteEntry(e.Name);

        Process process = Process.Start(startInfo);
        process.EnableRaisingEvents = true;
    }
    catch (Exception ex)
    {
        EventLog.WriteEntry(ex.ToString());
    }
}

命令行工具 - 期望获取文件名作为参数

public class Program
{
    public static void Main(string[] args)
    {
        File.AppendAllText(pathToLog, string.Format("{0} - File got created in watched folder - doing conversion of {1}\n", DateTime.Now, args[0]));
    }
}

【讨论】:

  • 在登录选项卡下,选择本地系统帐户以及允许服务与桌面交互。我相信这具有高级别的特权。不幸的是,第三方 exe 是我所拥有的。没有 dll。
  • 感谢您的代码。我已经有了几乎完全一样的东西,但它没有用。我最终做的是创建一个无 GUI 的 Windows 应用程序,并使用任务调度程序在服务器上运行它。我选择了即使没有登录用户也可以运行的选项。我还必须创建一个文件夹(C:\Windows\SysWOW64\config\systemprofile\Desktop),因为没有这个文件夹,我通过任务计划程序运行的应用程序不会创建 excel 文件(不确定这个文件夹是如何解决这个问题的)。无论如何,现在 pdf2xl exe 正在运行并创建 excel 输出。
【解决方案2】:

几乎可以肯定,问题在于步骤 2 和 3 在非交互式会话 0 中不起作用。最大的区别不在调试版本和发布版本之间。但是在交互式桌面上运行和在会话 0 中运行的服务之间。

要摆脱这种情况并继续使用服务,您需要确保所有步骤都可以在会话 0 中运行。步骤 2 我们一无所知。第 3 步看起来涉及自动化 Excel。这是官方不支持的,并且已知在会话 0 下不起作用。您需要使用 Excel 以外的其他工具读取 Excel 文件。至于第 2 步,这取决于将 PDF 转换为 Excel 的第三方工具。

【讨论】:

  • 如果我将所有代码移动到控制台应用程序并使用 topshelf 将其作为 Windows 服务运行会有所帮助吗?然后我可以从控制台应用程序调用第三方 pdf-to-excel 命令行 exe 吗?在谷歌搜索了一整天后,我几乎放弃了从 Windows 服务调用第三方 exe 的想法。
  • 我强烈怀疑,问题在于代码在会话 0 中运行。Topshelf 不会改变这一点。我认为第 3 步涉及自动化 Excel 是否正确?
  • 不确定您到底在问什么,但流程如下: 1. 客户端 wpf 应用程序将 pdf 放入服务器“pdf”文件夹 2. Windows 服务使用 filesystemwatcher 获取它,运行第三方生成excel并将其放入“excel”文件夹的工具。 3. Windows 服务然后使用第二个文件系统观察器获取 Excel 文件,使用 OleDbConnection 将文件读取到数据表中。数据被处理并转储到第三个“xml”文件夹中。 4. 客户端 wpf 监视 xml 文件,清理它并显示结果。
  • 刚刚尝试完 Topshelf + Console App 组合。没有运气。这次光标只是单步执行代码,但没有生成 Excel 文件。 :-( 好的部分是 Windows 服务读取手动删除的 Excel 文件并按预期以 xml 文件格式返回处理后的数据,因此至少任务的后半部分正在工作。
  • 调试时,您将调试控制台应用程序,对吗?并且会话 0 中没有作为服务运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多