Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Shell() или Process.Start(). Что грамотнее?


Автор: kuzyaka 19.7.2007, 07:09
Для запуска внешнего приложения использовал в начале такой вариант:
Код

    Shell("cmd.exe /c mysql.exe " & _
        "--host=localhost " & _
        "--user=myuser " & _
        "--password=mypassword " & _
        "my_test < """ & Application.StartupPath & "\my_test.sql""", AppWinStyle.Hide, True)

    Shell("cmd.exe /c mysqldump.exe " & _
        "--host=localhost " & _
        "--user=myuser " & _
        "--password=mypassword " & _
        "--opt my_test > """ & Application.StartupPath & "\my_test.sql""", AppWinStyle.Hide, True)

Здесь из дампа создается база MySQL "my_test" и наоборот.
Все работает.

Потом выяснилось что есть еще класс Process для таких дел.
Решил попробовать и переписал:
Код

    Dim MyProcess As New Process
    MyProcess.StartInfo.FileName = "mysql.exe"
    MyProcess.StartInfo.Arguments = _
      "--host=localhost --user=myuser --password=mypassword my_test < """ & _
      Application.StartupPath & "\my_test.sql"""
    MyProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    MyProcess.Start()
    MyProcess.WaitForExit()

    Dim MyProcess0 As New Process
    MyProcess0.StartInfo.FileName = "mysqldump.exe"
    MyProcess0.StartInfo.Arguments = _
      "--host=localhost --user=myuser --password=mypassword --opt my_test > """ & _
      Application.StartupPath & "\my_test10.sql"""

    MyProcess0.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    MyProcess0.Start()
    MyProcess0.WaitForExit()

НЕ РАБОТАЕТ!!! mysql.exe и mysqldump.exe не воспринимает параметров.
Выдается информация как при запуске "mysql.exe" без параметров (т.е. справка).
Попробовал другое:
Код

    Dim MyProcess As New Process
    MyProcess.StartInfo.FileName = "7z.exe"
    MyProcess.StartInfo.Arguments = "a -tzip archive.zip -p" & strPassword & " my_test.sql"
    MyProcess .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    MyProcess.Start()
    MyProcess.WaitForExit()

А здесь все прекрасно работает.

Вопроса два.
1. Очевидный. Что не так в параметрах в случае с mysql.exe и mysqldump.exe.
2. Есть ли разница что использовать Shell() или Process.Start().

Автор: mr.DUDA 19.7.2007, 09:03
Юзайте Shell. Может Process-у не нравится формат строки параметров, с  > и <

Автор: kuzyaka 19.7.2007, 11:36
Цитата(mr.DUDA @  19.7.2007,  09:03 Найти цитируемый пост)
Юзайте Shell

Одно только не понятно, как преодолеть зависание по запуску через Shell?
У Process есть хоть Process.WaitForExit для решения проблемы, а у Shell - суши весла?


Автор: Naum 19.7.2007, 11:41
Цитата(MSDN)

Shell Function
Requirements
Namespace: Microsoft.VisualBasic 

Module: Interaction 

Assembly: Microsoft Visual Basic .NET Runtime (in Microsoft.VisualBasic.dll) 
Runs an executable program and returns an integer containing the program's process ID if it is still running.

Public Function Shell( _
   ByVal Pathname As String, _ 
   Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _ 
   Optional ByVal Wait As Boolean = False, _ 
   Optional ByVal Timeout As Integer = -1 _
) As Integer
Parameters
Pathname 
Required. String. Name of the program to execute, together with any required arguments and command-line switches. Pathname can also include the drive and the directory path or folder. 
Style 
Optional. AppWinStyle. A value chosen from the AppWinStyle enumeration corresponding to the style of the window in which the program is to be run. If Style is omitted, Shell uses AppWinStyle.MinimizedFocus, which starts the program minimized and with focus. 
The Style argument can have one of the following settings: 
Enumeration value Description 

  • AppWinStyle.Hide The window is hidden and focus is given to the hidden window. 
  • AppWinStyle.NormalFocus The window is given focus and displayed in its most recent size and position. 
  • AppWinStyle.MinimizedFocus The window is given focus and displayed as an icon. 
  • AppWinStyle.MaximizedFocus The window is given focus and displayed using the entire screen. 
  • AppWinStyle.NormalNoFocus The window is set to its most recent size and position. The currently active window remains in focus. 
  • AppWinStyle.MinimizedNoFocus The window is displayed as an icon. The currently active window remains in focus. 

Wait 
Optional. Boolean. A value indicating whether the Shell function should wait for completion of the program. If Wait is omitted, Shell uses False. 
Timeout 
Optional. Integer. The number of milliseconds to wait for completion if Wait is True. If Timeout is omitted, Shell uses -1, which means there is no timeout and Shell does not return until the program completes. Therefore, if you omit Timeout or set it to -1, it is possible that Shell might never return control to your program.

Автор: kuzyaka 19.7.2007, 12:44
Цитата(Naum @  19.7.2007,  11:41 Найти цитируемый пост)
Цитата(MSDN)

Заодно уж, чтобы закрыть вопрос: Цитата(MSDN VS2003 по русски)
Цитата
Функция Shell
Запускает исполняемую программу и возвращает целочисленное значение, содержащее идентификатор процесса программы, если она все еще выполняется.

Public Function Shell( _
   ByVal Pathname As String, _ 
   Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _ 
   Optional ByVal Wait As Boolean = False, _ 
   Optional ByVal Timeout As Integer = -1 _
) As Integer
Параметры
Pathname 
Обязательный. String. Имя исполняемого файла со всеми необходимыми аргументами. Pathname может также содержать имя диска и путь. 
Style 
Необязательный. AppWinStyle. Значение, выбираемое из перечисления AppWinStyle, соответствующее стилю окна, в котором запускается программа. Если параметр Style опущен, Shell использует значение AppWinStyle.MinimizedFocus, запускающее программу в свернутом окне с фокусом. 
Аргумент Style может принимать одно из следующих значений: 

Значение перечисления Описание 
AppWinStyle.Hide Окно скрыто, и фокус передан скрытому окну. 
AppWinStyle.NormalFocus Окно получает фокус и отображается в своих предыдущих размере и позиции. 
AppWinStyle.MinimizedFocus Окно отображается как значок и имеет фокус. 
AppWinStyle.MaximizedFocus Окно получает фокус и развернуто во весь экран. 
AppWinStyle.NormalNoFocus Окно восстанавливает свои последние размер и позицию. Активное в данный момент окно остается активным. 
AppWinStyle.MinimizedNoFocus Окно отображается в виде значка в панели задач. Активное в данный момент окно остается активным. 

Wait 
Необязательный. Boolean. Значение, определяющее, должна ли функция Shell ожидать завершения выполнения программы. Если параметр Wait опущен, Shell использует False. 
Timeout 
Необязательный. Integer. Длительность в миллисекундах интервала, в течение которого ожидается завершение выполнения программы, если Wait равно True. Если параметр Timeout опущен, Shell использует-1, то есть таймаут не используется и Shell ожидает завершения выполнения программы. Таким образом, если вы опустите Timeout или установите его в -1, существует возможность, что Shell никогда не передаст управления вашей программе. 

То есть резюме выходит такое:
У Shell и у Process кухня одинаковая - обертки разные?
Это как DAO и ADO.
Какая обертка работает ту и используй.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)