我一直在寻找可能的解决方案和解释,但我找不到任何真的。
正在从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-command和一个简单的替代方案,我会喜欢它,但我还没有看到任何东西。
编辑: 忘了添加我正在尝试发送到打印机的文件是一个pcl文件。
EDIT2: 当我运行命令而没有将Hidden windowstyle和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();
如果用户单击表单中的按钮执行上述代码,则上述代码有效。所以我决定将我的代码更改为托盘应用程序运行,因为我认为这可能会解决问题 - 但它仍然似乎拒绝运行。它是由某个触发计时器还是另一个线程运行的某种问题?或者可能与这些方法的权利有关?
答案 0 :(得分:2)
将您的代码更改为:
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目录。
http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm
' Sysnative'文件夹在Windows资源管理器中不可见如果您 启动Windows资源管理器并打开硬盘上的Windows文件夹, 您可能会注意到Sysnative文件夹未显示。主要原因 对此,Windows资源管理器是一个64位程序(在运行时 64位Windows),Sysnative文件夹只能看到 可从32位软件访问。如果64位软件需要访问 Windows中的64位系统文件夹,唯一的选择是使用 System32文件夹名称(例如:C:\ Windows \ System32)。
使用' Sysnative'文件夹将帮助您从中访问64位工具 32位代码64位Windows中的某些工具仅存在于64位中 版;没有32位版本可用。还有一些这样的工具 位于64位System32文件夹中。一个例子是nbtstat 用于帮助解决NetBIOS名称解析的工具 问题。如果您尝试从32位代码运行nbtstat工具(for 来自应用程序或脚本的示例)并使用类似的路径 C:\ Windows \ System32,你会得到一个"找不到文件"错误。文件 无法找到;虽然Windows资源管理器显示了nbtstat 程序文件实际上位于C:\ Windows \ System32文件夹中 这个(有点令人困惑)问题的解决方案是包括 要运行的文件夹路径中的虚拟Sysnative文件夹 工具。例如:C:\ Windows \ Sysnative \ nbtstat.exe 上面的文件路径将允许您从a访问64位nbtstat工具 32位应用程序或32位脚本。我们建议您阅读 这篇文章/博客文章(在Scottie的Tech.Info上)获取更多细节 关于这个。