在vb.net中如何判断程序是从命令行启动还是通过点击.exe文件启动?

3

你好,我正在使用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

感谢您的帮助。
6个回答

2
看起来你已经在正确的方向上了,但是你应该检查第一个位置后的参数。根据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

这有点正确。如果用户双击.exe文件,那么Windows将以无命令行参数的方式启动您的程序。另一方面,您也无法阻止用户在没有参数的情况下从命令行启动您的应用程序。您也不能阻止用户在命令行手动输入与调用程序传递的相同参数。

您目前代码的一个问题是,Environment.GetCommandLineArgs()数组中的第一个元素(索引0)实际上是您程序的名称(即.exe文件的名称)。您可以通过检查索引1来避免此问题,但如果没有其他参数,则会引发IndexOutOfBoundsException异常。因此,在对其进行索引之前,您需要检查数组的长度。


0
你应该添加一个布尔值并这样做。
Public AllowAppRunV As Boolean = Nothing
Public Sub CheckForCommandLine()
    For Each arg As String In My.Application.CommandLineArgs

        Select Case Trim(LCase(arg))
            Case "/allowrun"
                MessageBox.Show("allow")
                AllowAppRunV = True
            Case Else

                MessageBox.Show("else")

        End Select

    Next

    If AllowAppRunV = True Then

    Else
        MessageBox.Show("Close")
    End If
End Sub

我知道这已经是很久以前的事了,但或许有人会觉得这很有用。


0

除非我没有理解你的意思,否则你应该遍历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

这里唯一棘手的部分是解析for循环中“arg”的值,因为它将类似于“SomeArgument=someValue”。我的代码没有将它们拆分出来,你可能想要这样做。

0

虽然这篇文章有点老,但是对于任何正在阅读的人来说,我发现最简单的方法就是检查是否有超过1个参数。

If arg.Count > 1 Then
    'Code
End If

第一个参数将始终是您要启动的应用程序的名称。


0

这应该可以工作:

If Console.LargestWindowHeight = 0 Then
   'Forms application
Else
   'Command line application
End If

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接