Process.Start()可以考虑系统PATH吗?

dre*_*010 6 c# system.diagnostics path process.start

我一直在寻找和尝试一段时间,但我没有运气.

我正在尝试制作一个控制台程序来自动完成一些我无法用BAT文件完成的任务.我想从Windows SDK调用"signcode.exe",bin文件夹包含系统PATH中的所有工具,我可以从任何地方调用"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
Run Code Online (Sandbox Code Playgroud)

我已确认StartInfo.EnvironmentVariables ["Path"]与我的系统路径匹配,并包含Windows SDK文件夹.手动设置也不起作用.

我甚至尝试过设置TempPath,如环境变量属性的MSDN页面所示,但这也不起作用.我想知道为什么你可以设置它,如果它没有效果.

如果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'
Run Code Online (Sandbox Code Playgroud)

路径"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin"是signtool.exe的位置,我可以通过简单输入从命令提示符运行它signtool,但如果我从同一个提示符运行此应用程序,它不会注册该路径.

小智 14

添加到mhutch的答案:它确实考虑了PATH,但我注意到你实际上需要重新启动Visual Studio以获取任何路径更改.这有点偷偷摸摸.


Mik*_*son 5

我很确定Process.Start确实尊重PATH.

  • 你确定你的signCommand值是否正确?
  • PATH中的目录值是否使用引号指定?文件提到这些价值观不会得到尊重.

请注意,FileName也可以是可执行文件的完整路径.

  • 您总是可以手动搜索PATH:string ResolveFullPath(string name){return fullName = Path.IsPathRooted(name)?name:Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator).Select(dir => Path.Combine(dir.Trim('"'),name)).First(File.Exists);} (2认同)