C# 从windows服务打印pcl文件的LPR命令不工作(现在是托盘应用程序)

C# 从windows服务打印pcl文件的LPR命令不工作(现在是托盘应用程序),c#,printing,windows-services,processstartinfo,lpr,C#,Printing,Windows Services,Processstartinfo,Lpr,我已经四处寻找了一段时间,寻找可能的解决方案和解释,但我真的找不到任何东西 正在从windows服务运行以下命令。如果直接在cmd中使用,则相同的命令不起作用。 它不会返回任何错误或与此相关的任何其他内容 System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnosti

我已经四处寻找了一段时间,寻找可能的解决方案和解释,但我真的找不到任何东西

正在从windows服务运行以下命令。如果直接在cmd中使用,则相同的命令不起作用。 它不会返回任何错误或与此相关的任何其他内容

    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "cmd.exe";
    startInfo.Arguments = "/C lpr.exe –S " + printerIP + " –P " + deviceName + " –o l " + fInfo.DirectoryName + @"\" + fInfo.Name;
    process.StartInfo = startInfo;
    process.Start();
这可能只是我错过的一些小事,但我就是看不见。如果可以使用lpr命令进行简单的替换,我很乐意,但我还没有看到任何东西

编辑: 忘记添加我试图发送到打印机的文件是pcl文件

编辑2: 当我在没有应用于进程的隐藏WindowsStyle和WaitForExit(5000)的情况下运行该命令时,我似乎看不到任何已写入的命令行—显示的只是空的命令提示符

编辑3: 我一直在玩弄这个,现在我想到了以下几点:

    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "lpr";
    startInfo.Arguments = " –S " + printerIP + " –P " + deviceName + " –o l " + fInfo.DirectoryName + @"\" + fInfo.Name;
    process.StartInfo = startInfo;
    process.Start();

如果用户单击表单中的按钮执行上述代码,则该代码可以正常工作。因此,我决定将代码改为作为托盘应用程序运行,因为我认为这可能会解决问题,但它似乎仍然拒绝运行。由触发的计时器或其他线程运行可能会有某种问题吗?或者可能与这些方法的权限有关?

将代码更改为:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C C:\windows\Sysnative\lpr.exe –S " + printerIP + " –P " + deviceName + " –o l " + fInfo.DirectoryName + @"\" + fInfo.Name;
process.StartInfo = startInfo;
process.Start();
问题是您试图从32位cmd.exe应用程序访问64位应用程序(lpr)。简单的解决方案是使用sysnative目录

如果需要,则“Sysnative”文件夹在Windows资源管理器中不可见 启动Windows资源管理器并打开硬盘上的Windows文件夹, 您可能会注意到,没有显示Sysnative文件夹。主要原因 这是因为Windows资源管理器是一个64位程序(在 64位Windows),并且Sysnative文件夹仅可见且 可从32位软件访问。如果64位软件需要访问 64位系统文件夹在Windows中,唯一的选项是使用 System32文件夹名称(例如:C:\Windows\System32)

使用“Sysnative”文件夹将帮助您从中访问64位工具 32位代码64位Windows中的某些工具仅存在于64位Windows中 版本没有可用的32位版本。还有一些工具 位于64位System32文件夹中。一个例子是nbtstat 用于帮助解决NetBIOS名称解析问题的工具 问题。如果您尝试从32位代码运行nbtstat工具(对于 示例(来自应用程序或脚本),并使用类似 C:\Windows\System32,将出现“找不到文件”错误。档案 找不到;虽然Windows资源管理器显示nbtstat 程序文件实际上位于C:\Windows\System32文件夹中。
解决这个(有些混乱)问题的方法是包括 要运行时,文件夹路径中的虚拟系统本机文件夹 工具。例如:C:\Windows\Sysnative\nbtstat.exe 上面的文件路径将允许您从 32位应用程序或32位脚本。我们建议你阅读 这篇文章/博客文章(在Scottie's Tech.Info)可以获得更多细节 关于这个


你有没有收到任何错误或异常,或者它只是什么都不做?它完全什么都不做。我将代码包装在一个trycatch中,并将其写入一个txt中,其中包含可能发生的任何错误。无论是否使用有效的printerIP、deviceName和文件,它都不起作用。它几乎不执行,但它应该执行,不是吗@YannickBlondeauDo请记住,该服务尚未获得完全的用户访问权限,您将文件写入何处?它将被发送到网络打印机。虽然它不再作为服务运行,而是作为没有可见表单的表单应用程序运行。该命令仍在另一个线程(或由计时器)中执行。是否该线程需要被授予管理员权限@Bugfinder你确定找到了lpr.exe吗?您不需要管理员权限,但不需要单步执行代码、跟踪发生的情况、执行代码并捕获所有响应等。。很难知道。lpr可能会返回一个错误代码,但不会将任何错误代码反馈到你的应用程序中。我发现它有点神奇,但它工作得很好,谢谢!