1

我正在尝试运行 LPR 命令来打印 PDF。我正在使用的代码是通过单击 Windows 窗体应用程序中的按钮执行的。

代码:

var command = @"lpr –S 192.168.1.245 –P DAILY C:\Test.pdf";
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.RedirectStandardError = true;
procStartInfo.CreateNoWindow = true;

// start process
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();

proc.WaitForExit();

// read process output
string cmdError = proc.StandardError.ReadToEnd();
string cmdOutput = proc.StandardOutput.ReadToEnd();

该程序作为 x64 程序运行,因此它可以在 C:\Windows\System32 文件夹中找到 lpr 程序。

当代码执行时,错误字符串为空,输出字符串包含以下内容(与命令运行时相同的输出lpr /?

输出:

将打印作业发送到网络打印机

用法:lpr -S 服务器 -P 打印机 [-C 类] [-J 作业] [-o 选项] [-x] [-d] 文件名

选项: -S 服务器 提供 lpd 服务的主机的名称或 IP 地址 -P 打印机 打印队列的名称 -C 类 用于突发页面的作业分类 -J 作业 用于在突发页面上打印的作业名称 -o 选项 表示类型文件(默认为文本文件) -x 与 SunOS 4.1.x 及之前的兼容性 -d 先发送数据文件

如果我完全按照代码中显示的方式复制和粘贴命令并将其粘贴到命令窗口中,即使它是应用程序打开的相同命令窗口,它也可以正常工作。

有没有人知道为什么会发生这种情况?提前致谢!

4

1 回答 1

3

我能够弄清楚。如果它对其他人有帮助,那么有效的代码是

var command = @"lpr -S 192.168.1.245 -P ""DAILY"" ""C:\Test.pdf""";
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/C " + command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.RedirectStandardError = true;
procStartInfo.CreateNoWindow = true;

// start process
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();

proc.WaitForExit();

// read process output
string cmdError = proc.StandardError.ReadToEnd();
string cmdOutput = proc.StandardOutput.ReadToEnd();

请注意,队列名称和文件名用引号括起来。我的另一个问题是我最初是从电子邮件中复制命令的,所以破折号是错误的,我必须删除并在命令中手动输入破折号才能被识别。如果您在原始问题中看起来非常接近,您会看到破折号稍长。

有关确保 lpr 命令可用的信息,尤其是在 64 位计算机上运行 32 位应用程序时,请参阅以下参考资料。

参考 1:lpr 命令在 Win 7 中的 C# 程序中不起作用

参考2:http ://www.tomshardware.com/forum/240019-44-error-windows

于 2017-09-22T19:05:59.183 回答