c# - Process.Start() 可以考虑系统路径吗?

标签 c# path system.diagnostics process.start

我已经为此搜索和试验了一段时间,但我没有运气。

我正在尝试制作一个控制台程序来自动执行一些我无法使用 BAT 文件完成的任务。我想从 Windows SDK 调用“signcode.exe”,我的系统 PATH 中包含所有工具的 bin 文件夹,我可以从任何地方调用“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 文件夹。手动设置它也不起作用。

我什至尝试设置 TempPath,如 EnvironmentVariables Property 的 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'

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

最佳答案

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

关于c# - Process.Start() 可以考虑系统路径吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8003272/

相关文章:

c# - 在 C# 中更新 Windows 注册表有多安全?

python - 为什么 virtualenv 不包含所有系统路径?

objective-c - 意外的应用程序支持路径

python - 如何从根路径自动重定向?

c# - 如何全局跟踪.net core 2.1 中的所有HTTP 请求?

c# - 通信安全 : Fiddler intercepts my talks. 如何保护我的应用程序?

C# Lambda 性能问题/可能性/指南

c# - 如何让子窗口与主窗口一起最小化和最大化

c# - 系统.诊断.进程(); StartInfo.Arguments 使用环境变量作为参数

c# - 当本地服务帐户在服务中运行时,并非有关 Process.GetProcesses 中进程的所有信息