#c# #windows #process.start #microfocus
#c# #Windows #process.start #микрофокус
Вопрос:
Вот ситуация. У нас есть очень старый COBOL exe, который будет работать только в Windows XP. Для запуска этого exe-файла мы настроили виртуальную машину XP. Каждую неделю пользователь запускает серию файлов BAT.
Я пытаюсь написать приложение C # для Windows, которое будет работать на виртуальной машине, а затем выполнить COBOL exe. План состоит в том, чтобы использовать процесс.Начните вызывать EXE. Все работает нормально, ЕСЛИ МОЙ WINDOWS C # EXE запускается в том же каталоге, что и COBOL exe.
Когда я перемещаю C # exe из папки, я получаю неверный код возврата, и cobol не выполняется.
Не вдаваясь в подробности, я хочу иметь возможность запускать COBOL извне папки. Причина в том, что у нас есть несколько региональных офисов, и у каждого из них есть своя собственная папка и своя копия cobol exe внутри каждой папки. Цель здесь состоит в том, чтобы позволить пользователю выбрать каждое региональное отделение, а затем программа C # выполнит каждую программу в каждом каталоге.
Вкратце. Если я запускаю C # внутри папки, в которой находится исполняемый файл COBOL, ОН РАБОТАЕТ. НО если я перемещаю C # за пределы этой папки, это НЕ
Я надеюсь, что все это имеет смысл. Вот некоторые дополнительные сведения:
- Создано в Visual Studio 2012 как приложение C # для Windows
- Целевая платформа x86 (я также использовал любой процессор)
- Целевая платформа .NET Framework 4
- COBOL — это микрофокус 1997 года выпуска (да, я знаю. Нам нужно избавиться от этого)
- Виртуальная машина — это Windows XP
- Если я изменю exe файл на Блокнот, он будет работать нормально
-
Если я все-таки запущу run из Windows и вставлю это: K:AMSappMYTESTFOLDERAMSBLD.exe он работает нормально.
-
Код C # для события нажатия кнопки (примечание: если я изменю имя файла на это K:AMSappMYTESTFOLDERAMSBLD.exe я получаю те же результаты. Он не запускается ) Также в окне сообщения отображается 255 для кода возврата, когда он не работает. Если программа на C # перемещается внутрь папки cobol, она возвращает ноль.
private void button1_Click(object sender, EventArgs e) { try { int exitCode; Process process = new Process(); process.StartInfo.FileName = @"\SERVER23021PRODDATAAMSappMYTESTFOLDERAMSBLD.exe"; process.StartInfo.ErrorDialog = true; process.Start(); process.WaitForExit(1000 * 60 * 5); // Wait up to five minutes. exitCode = process.ExitCode; MessageBox.Show("My exit code = " exitCode.ToString()); MessageBox.Show("my path and file name: " process.StartInfo.FileName); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
Комментарии:
1. Попробуйте
process.StartInfo.WorkingDirectory = Path.GetFullPath(process.StartInfo.FileName);
2. Похоже, у вас может возникнуть проблема с разрешением на выполнение. Я бы посмотрел, под какой учетной записью вы используете их, и разрешено ли этой учетной записи запускать оба приложения. Кроме того, если вы пересекаете какие-либо границы, вам может потребоваться просмотреть олицетворение при выполнении вызова.
3. >>> ЭТО СРАБОТАЛО. Сначала он не использовал полный сетевой путь. Я изменил его на K: затем путь к файлу. Также я вместо использования Path . GetFullPath(процесс. StartInfo. Имя файла) Я просто жестко запрограммировал K: path минус фактическое имя файла, и это сработало. Большое спасибо.
Ответ №1:
Попробуйте установить для рабочего каталога процесса тот же путь, что и для файла cobol exe.
process.StartInfo.WorkingDirectory = System.IO.Path.GetFullPath(process.StartInfo.FileName);
Комментарии:
1. Мой комментарий был просто для того, чтобы дать подсказку OP. Но это неправильный ответ. Что делать, если этот код вызывается перед настройкой
process.StartInfo.FileName
? Синтаксически правильно, но логически неправильно.. Поэтому не копируйте чужие коды, напишите правильный самостоятельно..
Ответ №2:
Я думаю, вам следует использовать ProcessStartInfo.Domain
для установки домена и после этого пути к exe внутри ProcessStartInfo.FileName
. Экземпляр ProcessStartInfo
перехода в Process.Start
метод
ProcessStartInfo psi = new ProcessStartInfo();
psi.Domain = @"SERVER23021";
psi.FileName = @"PRODDATAAMSappMYTESTFOLDERAMSBLD.exe";
Process.Start(psi);
Если вам нужно персонализировать свой вызов, вы можете установить Username
и Password
. Но вы должны помнить, что вам нужно предоставить их как пару. UseShellExecute
должно быть установлено значение false
и WorkingDirectory
должно быть также предоставлено. Подробнее: https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.password (v = против 110).aspx
Комментарии:
1. Что должно быть установлено
ProcessStartInfo.Domain
? Как вы думаете, почему это должно решить проблему OP? Почему вы описываете это вместо публикации нескольких строк компилируемого / рабочего кода?2. @L.B: сначала посмотрите на ваш комментарий. Нет причин, по которым это могло бы помочь. Никаких подсказок о том, что он делает. Если вы проголосовали против, пожалуйста, не будьте таким лицемером. Я не вставлял никакого кода, потому что он есть в документации с объяснением. Я точно указал, какой класс следует использовать, какое свойство следует использовать для этого класса и куда передать экземпляр этого класса
3.
Look at yours comment first
Да, это комментарий , а не ответ. Если вы публикуете что-то в качестве ответа, это должен быть ответ …4. До сих пор я не мог комментировать. Я смог сделать это только в своем ответе. Вы должны иметь в виду, что новые пользователи не могут комментировать все