Я искал и экспериментировал некоторое время с этим, но мне не повезло.
Я пытаюсь создать консольную программу для автоматизации некоторых задач, которые я не мог выполнить с файлом BAT. Я хочу вызвать «signcode.exe» из Windows SDK, папки 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
Я подтвердил, что StartInfo.EnvironmentVariables["Path"] соответствует моему системному пути и содержит папку Windows SDK. Установка вручную тоже не работает.
Я даже пытался установить TempPath, как показано на странице MSDN для EnvironmentVariables Property", но это тоже не сработало. Интересно, почему вы могли бы установить это, если это не имеет никакого эффекта.
Если 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
, но если я запущу это приложение из того же приглашения, оно не зарегистрирует этот путь.