我使用.net framework 4.0客户端配置文件在VS2010上创建服务。目标机器是Windows Server 2003 64位。该服务移动一些文件,然后使用System.Diagnostics.Process执行一个进程。问题在于,即使taskmanager显示一个进程正在启动,可执行文件也不会做任何事情。示例代码:System.Diagnostics.Process无法启动进程
private void imprimir(string nombreImpresora, int copias, string nombreArchivo)
{
try
{
string copiasSumatra = "1,";
for (int i = 1; i < copias; i++)
{
copiasSumatra += "1,";
}
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string comando = String.Format("-print-to \"{0}\" \"{1}\" -print-settings \"{2}odd,fit\" -silent", nombreImpresora, nombreArchivo, copiasSumatra);
string filename = '"' + Path.Combine(path, "SumatraPDF.exe") + '"';
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.WorkingDirectory = path;
proc.StartInfo.FileName = filename;
proc.StartInfo.Arguments = comando;
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.ErrorDialog = false;
proc.Start();
proc.WaitForExit();
lc.writeToLog("Instruction executed. Exit code: " + proc.ExitCode);
}
catch (Exception ex)
{
lc.writeToLog(ex.Message + " " + ex.StackTrace);
}
}
如果我执行它在我的dev的机器(的Windows 8专业版),或在另一个测试服务器(Windows Server 2003 32位),它使什么预期。如果我在WS2003 64位服务器上运行它,它什么也不做。
我调试了很多次,看它是否会产生一些我错过的错误,但没有任何反应。 “lc.writeToLog”方法将文本打印到文件。我用它来记录执行的每一行,但不会抛出任何错误。使用该方法,我已经得出结论,它通过“proc.WaitForExit()”指令,所以我认为它会按照我编程的内容进行,但没有任何反应。
我跑了相同的指令,但传递给用户,密码和域,结果是一样的。还尝试捕获标准错误和输出,但它不包含任何内容。
有什么可能是麻烦?
运行另一个进程通常会在出现问题时给出非常差的诊断信息。特别是当你不检查Process.ExitCode时,唯一的办法就是*可以*看到出错的地方。没有设置StartInfo.WorkingDirectory也是一个很大的错误,该文件实际上可以创建,但你无法找到它,因为你不知道要查找什么目录。避免.bat文件,他们可以做的任何事情都可以做在C#中也是如此。 –
我已经更新了我的代码以使用你的提示,正如你所看到的。现在它显示了我正在尝试执行的实际代码(用sumatra pdf打印pdf)。进程退出代码是2. – t3b4n
这通常意味着“文件未找到”,当然是一个非常常见的错误。从不存在的打印机或文件不存在的地方来看,* nombreArchivo *必须是该文件的完整路径。 –