2013-07-11 2 views
0

Хорошо, это тот, который меня превзошел. У меня есть программа, которая должна быть установлена ​​на разных компьютерах, которые должны выполнять пакетный файл после завершения конкретной задачи. Пакетный файл настраивается через наш веб-сервис пользователем, и приложение вытягивает эту строку пути вниз, а затем выполняет файл по этому пути. Должно быть довольно просто/просто, правильно?VB.NET Запуск пакетного файла не работает после установки

Код:

Private Function ExecuteBatchFile(batchFilePath As String) As String 
    Try 
     Dim psi As New ProcessStartInfo(batchFilePath) 
     psi.RedirectStandardError = True 
     psi.RedirectStandardOutput = True 
     psi.CreateNoWindow = False 
     psi.UseShellExecute = False 
     Dim process As Process = process.Start(psi) 
     process.WaitForExit() 
     ExecuteBatchFile = process.ExitCode 
    Catch ex As Exception 
     StrAppStatus = "Error within execution of batch file: " & ex.Message 
     LogMe(StrAppStatus) 
     Return "Fail" 
    End Try 
End Function 

Теперь, для сложной части. Этот код отлично работает при работе в среде dev. У меня еще есть проблема. ОДНАКО, когда приложение установлено на любом компьютере (включая тот же, на котором установлена ​​IDE), когда он переходит к шагу в его общем процессе, который вызывает эту функцию, он фактически не запускает командный файл. Имейте в виду, он никогда не исключает исключение с обеих сторон. Он также не возвращает код выхода в эту строку, так как у меня есть другой журнал, чтобы отслеживать это.

В этом случае я могу представить только две возможности. Либо A :) существует проблема с разрешениями, когда приложению не разрешено запускать пакетные файлы на компьютере, на котором он установлен, или B :) этот суб-вызов вызывается потоком, который был выделен из основного потока (то есть с помощью MyThread = New System.Threading.Thread(AddressOf TheMainLoop) MyThread.Start() команда).

По-прежнему факт, что он работает 100% времени во время этапа компиляции и запуска в среде IDE, но не после того, как установка раздувает мой разум.

EDIT 1: Просто сделала тест, где я поставил кнопку на самой основной форме, и событие щелчка делает то же самое, что и ранее функции, и она работает, даже после установки. Это заставляет меня думать, что он будет работать, только если он запущен с использованием основной темы ... Что вы все думаете?

EDIT 2: Пакетный файл является очень простым тестом, партия, которая открывает текстовый файл, и я знаю, что пакетный файл и путь оба хорошо, потому что при компиляции он работает отлично. Кроме того, в редакторе 1 говорилось, что я создал простую кнопку, которая выполняет тот же код сверху, и работает после установки. Так как это было сделано в основном потоке, а код из предыдущего был сделан в отдельном потоке, выделенном из оригинала, мне было интересно, если это было причиной проблемы. Другая сумасшедшая вещь заключается в том, что мой журнал ловят, если файл запускается или нет, и он почти действует так, как будто он запускается, когда у меня есть эта оригинальная проблема. Ба, все это просто орехи.

EDIT 3: Добавлен ответ.

+2

Вы пытались установить UseShellExecute в true? – tinstaafl

+0

Хм. Нет, у меня нет. Я не совсем уверен, что понимаю, как работает вся эта команда. в чем разница между истинным и ложным для этого свойства? –

+0

На странице [MSDN] (http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.processstartinfo.useshellexecute%28v=vs.100%29.aspx): Получает или задает значение, указывающее, следует ли использовать оболочку операционной системы для запуска процесса.Когда вы используете оболочку операционной системы для запуска процессов, вы можете запустить любой документ (который является любым зарегистрированным типом файла, связанным с исполняемым файлом, который имеет действие по умолчанию для открытого действия) и выполнять операции над файлом, такие как печать, с помощью объекта Process , Когда UseShellExecute является ложным, вы можете запускать только исполняемые файлы, используя объект Process. « – tinstaafl

ответ

0

Благодаря tinstaafl, ответ должен был заменить UseShellExecute на True. Мне пришлось удалить строки RedirectStandardError и RedirectStandardOutput, но я их не использовал. В этой заметке, спасибо всем за ваши расследования, и если у кого-нибудь есть идея, почему это произошло, я все уши.

Смежные вопросы