无法通过C#启动进程。也许是因为空白

时间:2012-11-20 11:59:05

标签: c# command-line

我有(在设置之后从调试器复制,以确保实际传递给命令的内容):

process.StartInfo.FileName = "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe"

process.StartInfo.Arguments = " sign /f \"C:\\Users\\...\\myPfx.pfx\" /p \"myPassword\" \"C:\\Users\\...\\Desktop\\app.exe\""

但是当我Start()它没有签署应用程序时。 (当我将signtool复制到该文件夹​​并手动执行时 - 它可以工作。) 所以,为了调试,我尝试了:

System.Diagnostics.Process.Start(@"cmd.exe", @" /k " + "\"" + process.StartInfo.FileName + "\"" + " " + "\"" + process.StartInfo.Arguments + "\"");

但我明白了:

  

'C:\ Program'未被识别为内部或外部命令,   可操作程序或批处理文件。

那么我该如何让签名工作(或者至少是cmd,这样我才能看到问题究竟是什么?)

编辑:谢谢大家。问题如下所述 - 缺少引号。虽然我在发布问题之前确实尝试过(给所有内容添加引号) - 然后它就不起作用了。事实证明我在引号和实际参数之间添加了一些空格。所以这似乎导致错误。

3 个答案:

答案 0 :(得分:3)

您的文件名需要引用

process.StartInfo.FileName = "\"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe\""

修改

请尝试使用此功能,这对我来说可以使用虚拟文件

string filename = "\"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe\""
string arguments = "sign /f \"C:\\Users\\...\\myPfx.pfx\" /p \"myPassword\" \"C:\\Users\\...\\Desktop\\app.exe\""
Process.Start("cmd.exe /k " + filename + " " + arguments)

答案 1 :(得分:1)

请尝试这个,创建一个ProcessStartInfo对象,然后将Process的StartInfo设置为新对象:

ProcessStartInfo startInfo = new ProcessStartInfo();

string filename = "\"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe\""
string arguments = " sign /f \"C:\\Users\\...\\myPfx.pfx\" /p \"myPassword\" \"C:\\Users\\...\\Desktop\\app.exe\""
startInfo.Arguments = filename + arguments;
startInfo.FileName = "cmd.exe";
startInfo.UseShellExecute = false;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;

startInfo.WorkingDirectory = "set your working directory here";
Process p = new Process();

p.StartInfo = startInfo;
p.Start();

string output = p.StandardOutput.ReadToEnd();
string error = p.StandardError.
//Instrumentation.Log(LogTypes.ProgramOutput, output);
//Instrumentation.Log(LogTypes.StandardError, error);

p.WaitForExit();

if (p.ExitCode == 0) 
{        
    // log success;
}
else
{
    // log failure;
}

答案 2 :(得分:0)

您可能需要将WorkingDirectory属性设置为桌面(app.exe所在的位置),并将“app.exe”(不带路径)传递给arguments属性。