Хорошо, это тот, который меня превзошел. У меня есть программа, которая должна быть установлена на разных компьютерах, которые должны выполнять пакетный файл после завершения конкретной задачи. Пакетный файл настраивается через наш веб-сервис пользователем, и приложение вытягивает эту строку пути вниз, а затем выполняет файл по этому пути. Должно быть довольно просто/просто, правильно?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: Добавлен ответ.
Вы пытались установить UseShellExecute в true? – tinstaafl
Хм. Нет, у меня нет. Я не совсем уверен, что понимаю, как работает вся эта команда. в чем разница между истинным и ложным для этого свойства? –
На странице [MSDN] (http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.processstartinfo.useshellexecute%28v=vs.100%29.aspx): Получает или задает значение, указывающее, следует ли использовать оболочку операционной системы для запуска процесса.Когда вы используете оболочку операционной системы для запуска процессов, вы можете запустить любой документ (который является любым зарегистрированным типом файла, связанным с исполняемым файлом, который имеет действие по умолчанию для открытого действия) и выполнять операции над файлом, такие как печать, с помощью объекта Process , Когда UseShellExecute является ложным, вы можете запускать только исполняемые файлы, используя объект Process. « – tinstaafl