【发布时间】:2011-12-21 15:24:55
【问题描述】:
我一直在搜索和试验这个,但我没有运气。
我正在尝试制作一个控制台程序来自动执行一些我无法使用 BAT 文件完成的任务。我想从 Windows SDK(包含系统 PATH 中所有工具的 bin 文件夹)调用“signcode.exe”,并且可以从任何地方调用“signcode”,但Process.Start 忽略了路径。
当前代码:
System.Diagnostics.Process sign = new System.Diagnostics.Process();
sign.StartInfo.FileName = signCommand.Substring(0, signCommand.IndexOf(' ')); // signtool.exe
sign.StartInfo.Arguments = signCommand.Substring(signCommand.IndexOf(' ') + 1); // /sign /a file1 file2
// sign.StartInfo.EnvironmentVariables["Path"] = Environment.GetEnvironmentVariable("PATH"); // This doesn't work either
sign.StartInfo.UseShellExecute = false;
sign.StartInfo.RedirectStandardOutput = true;
sign.StartInfo.RedirectStandardError = true;
sign.Start(); // Throws Win32Exception - The system cannot find the file specified
我已确认 StartInfo.EnvironmentVariables["Path"] 与我的系统路径匹配,并且包含 Windows SDK 文件夹。手动设置也不行。
我什至尝试过在 MSDN 页面上为 EnvironmentVariables Property 设置 TempPath,但这也不起作用。我想知道如果它没有效果,为什么你可以设置它。
如果System.Diagnostics.Process 无法使用该路径,我可以使用其他功能吗?我也想在我的控制台应用程序中查看命令的输出。
这里是一些额外的调试值:
Console.WriteLine("Sign Filename = '{0}'", sign.StartInfo.FileName);
Sign Filename = 'signtool.exe'
Console.WriteLine("Sign Arguments = '{0}'", sign.StartInfo.Arguments);
Sign Arguments = '/sign /f C:\Visual Studio\Projects\MGInsight\MGInsight\APPARENTINC.pfx /t http://timestamp.comodoca.com/authenticode "C:\Visual Studio\Projects\MGInsight\MGInsight\Publish\Application Files\\MGInsight_0_9_1_85\MGInsight.exe" "C:\Visual Studio\Projects\MGInsight\MGInsight\Publish\Application Files\\MGInsight_0_9_1_85\XPXScanner.dll" "C:\Visual Studio\Projects\MGInsight\MGInsight\Publish\Application Files\\MGInsight_0_9_1_85\NetworkCalculations.dll"'
Console.WriteLine("Sign Path = '{0}'", sign.StartInfo.EnvironmentVariables["Path"]);
Sign Path = 'C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;"C:\Program Files\Intel\WiFi\bin\";"C:\Program Files\Common Files\Intel\WirelessCommon\";"C:\Program Files (x86)\cwRsync\bin";"C:\Program Files (x86)\Git\cmd";"C:\Program Files (x86)\Git\bin";"C:\Program Files (x86)\Zend\ZendServer\bin";"C:\Program Files (x86)\Zend\ZendServer\share\ZendFramework\bin";"C:\Program Files\Java\jre6\bin";"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\";"C:\Program Files\Microsoft Windows Performance Toolkit\";C:\MinGW\bin;"C:\Program Files (x86)\Microsoft\ILMerge";"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin";C:\Program Files (x86)\Nmap'
路径"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin" 是signtool.exe 所在的位置,我可以通过简单地输入signtool 从命令提示符运行它,但是如果我从同一提示符运行此应用程序,它不会注册该路径。
【问题讨论】:
-
“不起作用”没有错误。你得到什么例外?至于你问题的输出部分,看StandardOutput。
-
sign.Start()后面注释的异常和它抛出的消息,是Win32Exception。
-
你说得对,我没有阅读代码块。 Win32Exception 不是来自签名工具本身吗?找不到您要签名的文件?尝试使用 /h 或其他不需要文件的参数来启动它。
-
@CodeCaster 不用担心,我应该在问题中说得更清楚,我会试一试,看看我得到了什么,谢谢!
-
我试过“signtool.exe 签名/?”但仍然得到异常而不是帮助内容输出到 STDOUT。
标签: c# path system.diagnostics process.start