Знаете ли вы, что программа запускается из командной строки и не нажимает на .exe в vb.net? - PullRequest
3 голосов
/ 09 января 2010

Привет, я пишу программу на vb.net. Программу можно запустить из другой программы, передав ей несколько аргументов, или ее можно запустить, нажав .exe Я хотел бы показать пользователю некоторые варианты в зависимости от того, куда он идет. Правильный ли приведенный ниже подход?

Private Sub Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Environment.GetCommandLineArgs(0).ToString = "SomeArgument" Then
      'Do some events
    Else
      'Do some other events
    End If

End Sub

Спасибо за вашу помощь.

Ответы [ 5 ]

2 голосов
/ 09 января 2010

Похоже, вы на правильном пути, однако вам следует проверять аргумент после первой позиции. Из документации GetCommandLineArgs :

Первый элемент в массиве содержит имя файла исполняющая программа. Если имя файла недоступно, первый элемент равно String.Empty. остальные элементы содержат любые дополнительные токены введены на командная строка.

Ваш код проверяет первый элемент массива, поэтому это будет имя программы. В зависимости от того, сколько аргументов вы ожидаете передать, вы должны пройти через него и определить, существует ли он.

For Each arg As String In Environment.GetCommandLineArgs()
    If arg = "SomeArg" Then
        ' do something
    End If
Next

' LINQ approach
If Environment.GetCommandLineArgs().Any(Function(arg) arg = "SomeArg") Then
    ' do something
End If

Кроме того, это строковый массив, поэтому нет необходимости использовать ToString() для элемента.

1 голос
/ 09 января 2010

Это как бы правильно. Если пользователь дважды щелкнет по EXE, Windows запустит вашу программу без аргументов командной строки. С другой стороны, вы не можете остановить пользователя, запускающего ваше приложение из командной строки без аргументов. Вы также не можете остановить пользователя, набирающего вручную в командной строке те же параметры, что и ваша вызывающая программа.

Единственное, что не так с вашим текущим кодом, это то, что первый элемент (индекс 0) в массиве Environment.GetCommandLineArgs () будет фактически именем вашей программы (именем EXE-файла). Вы можете обойти это, проверив индекс 1, но если дополнительных аргументов нет, это вызовет исключение IndexOutOfBoundsException. Поэтому вам нужно проверить длину массива перед его индексацией.

0 голосов
/ 27 февраля 2014

Это должно работать:

If Console.LargestWindowHeight = 0 Then
   'Forms application
Else
   'Command line application
End If
0 голосов
/ 15 апреля 2013

Что ж, это старо, но для любого, кто читает это, я считаю, что самый простой способ - просто проверить, есть ли более 1 аргумент.

If arg.Count > 1 Then
    'Code
End If

Первым аргументом всегда будет имя запускаемого приложения.

0 голосов
/ 09 января 2010

Если я не понимаю, что вы хотите, вам следует перебирать коллекцию CommandLine Args и запрашивать только те, которые не предоставлены. Это решит проблему пользователя, запускающего ваше приложение из командной строки без каких-либо аргументов. Таким образом, вы будете запрашивать только те аргументы, которые явно не переданы в командной строке.

Как это:

Dim someArgument as String = String.Empty
Dim myArgument as String = String.Empty


For Each arg as String In Environment.GetCommandLineArgs()
    If arg.StartsWith("SomeArgument") Then
        someArgument = arg
    End If
    If arg.StartsWith("MyArgument") Then
        myArgument = arg
    End If
    ' Continue for each extra argument
Next


If String.IsNullOrEmpty(someArgument) Then
    ' prompt for someArgument
End If

If String.IsNullOrEmpty(myArgument) Then
    ' prompt for myArgument
End If

Единственная сложная часть здесь - это анализ значения «arg» в цикле for, поскольку это будет что-то вроде SomeArgument = someValue. Мой код не разделяет их, вы, вероятно, захотите это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...