我正在创建一个应该使用lpr.exe并向其传递参数的C#应用程序。我现在正试图这样做:
DirectoryInfo filePathDirectory = new DirectoryInfo(filePath);
Process a = new Process();
a.StartInfo.FileName = @"C:\Windows\System32\lpr.exe";
a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " + "\"" + filePathDirectory + "\"";
a.StartInfo.UseShellExecute = false;
a.Start();
a.WaitForExit();
但是当我到达a.Start();
时,我得到一个未处理的Win32异常,该异常表明“系统无法找到指定的文件”。这真让我感到困惑,因为起初我认为这是我的论点,但事实证明,我可以从VB应用程序传递完全相同的参数并使其工作。
更新1:
有效的VB代码是:
Dim RPname As String
RPname = FileName.ToString
Dim a As New Process
a.StartInfo.FileName = "C:\Windows\system32\lpr.exe"
a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " & Chr(34) & RPname & Chr(34)
a.StartInfo.UseShellExecute = False
a.Start()
a.WaitForExit()
更重要的是,我的问题似乎与参数声明无关,因为我可以将其注释掉,但仍然会收到错误。
更新2:
我在进程开始时遇到的错误是:系统找不到指定的文件。如果我将FileName更改为“C:\ Windows \ System32 \”,我不会收到错误cmd.exe“,工作正常......
答案 0 :(得分:2)
您在c#代码中使用 DirectoryInfo 对象并将其隐藏起来。尝试将您的代码更改为:
try
{
DirectoryInfo filePathDirectory = new DirectoryInfo(filePath);
Process a = new Process();
a.StartInfo.FileName = @"C:\Windows\syswow64\lpr.exe"; // ADAPTED to the new path!! worked!
// use filePathDirectory.FullName!!
a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " + "\"" + filePathDirectory.FullName + "\"";
// or change it to - found it more readable imo
a.StartInfo.Arguments = string.Format(
"-SServerName.Domain.net -Plp \"{0}\"",
filePathDirectory.FullName);
a.StartInfo.UseShellExecute = false;
a.Start();
a.WaitForExit();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
修改强>
找到问题的解决方案!第一个 - 根据他的given answer去@Sundeep。他给我一个webSite指示
是的我有,但位于c:\ windows \ system32 的 64位文件不是 通过32位命令提示符(c:\ windows \ syswow64 \ cmd.exe)看到的是 从32位应用程序调用批处理文件时启动。
此外
...试图让32位程序启动 Windows 2008 R2中的lpr.exe。 失败,因为lpr.exe没有 存在于O / S的32位视图中。 ...
对于解决方法,我从32位O / S system32文件夹中复制了lpr *。* 在2008 R2机器上进入SYSWOW64 ......
答案 1 :(得分:0)
将您的代码更改为:
DirectoryInfo filePathDirectory = new DirectoryInfo(filePath);
Process a = new Process();
a.StartInfo.FileName = @"C:\Windows\Sysnative\lpr.exe";
a.StartInfo.Arguments = "-SServerName.Domain.net -Plp " + "\"" + filePathDirectory + "\"";
a.StartInfo.UseShellExecute = false;
a.Start();
a.WaitForExit();
Pilgerstorfer Franz的解释是完全正确的,但特别是在像我这样的环境中,在每台机器上移动和移动lpr.exe的位置是很多工作。简单的解决方案是使用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上)获取更多细节 关于这个。