Componente para extraer parámetros de la línea de comandos

 

Fecha: 03/Feb/99 (03/Ene/99)
Autor: Ignacio Cassou < Ignacio.Cassou@wl.com >


Te mando una utilidad que he creado a partir de código que hacía tiempo que usaba en mis aplicaciones pero que por pereza nunca me había decidido a re-escribir como un componente independiente.

Está realizado en VB5 y no se puede compilar en VB4 porque es un EXE ActiveX, aunque sí se puede utilizar desde un programa VB4 si ya se tiene el 'exe' del componente (por eso te lo adjunto también, además de que, como le he puesto compatibilidad binaria para evitar que cada vez que se compile genere un CLSID diferente, también es necesario tener el EXE en el mismo directorio en que esté el código fuente para que VB no se queje).

Se trata de un componente que permite extraer los parámetros que se le pasen a un programa VB de una forma sencilla y eficaz siempre y cuando se siga un determinado convenio en la forma de escribir los parámetros en la linea de comando. La forma de llamar al ejecutable VB sería :

Programa.exe /NombrePar1:ValorPar1/NombrePar2:ValorPar2/.....
Donde:
- NombrePar1, NombrePar2 pueden ser cualquier string de cualquier longitud (que no contengan ni '/' ni ':' claro) y da igual que sean mayúsculas o minúsculas.

- ValorPar1, ValorPar2 pueden ser cualquier string incluso aunque contengan '/' y ':' siempre y cuando no combinemos ambos signos de manera que el programa se haga un lío.Me explico : la rutina encuentra las parejas 'nombre parámetro-valor' buscando parejas de '/' y ':', es decir, lo que encuentre entre una '/' y ':' lo considera como el nombre del parámetro, mientras que todo lo que esté a la derecha de ':' será el valor del parámetro. Una vez encontrado un parámetro y su valor, lo elimina de la cadena y sigue buscando más parámetros.

Te envío también un sencillo programa de ejemplo de como usarlo y aquí explico (aunque sé que tú no necesitas esta explicación) como hacerlo, ya que se trata de un EXE ActiveX y para aquellos que nunca hayan usado ninguno puede ser problemático.

Para los que tengan VB5 (o superior) y lo quieran ejecutar en modo 'debug' :

- Abrir el proyecto ParamLC.vbp y generar de nuevo el ejecutable.
- Una vez generado lo ejecutáis usando 'Iniciar con compilación completa' (menú 'Ejecutar' en VB5).
- Abrir el proyecto EjemploParamLC.vbp (si habéis copiado el EXE de ParamLC que yo he adjuntado no deberéis tener problemas, de lo contrario ospodría suceder que en 'Proyecto->Referencias' os diera el error 'Referencia no encontrada')
- Como ya debéis de saber, los parámetros en modo 'debug' los toma de lo que se haya introducido en 'Proyecto->Propiedades->Generar->Argumentos de la línea de comandos'.
En el ejemplo que os envío hay unos parámetros de ejemplo que podéis cambiar a vuestro gusto y ver que realmente está extrayendo lo que le habés pasado.
- Ya lo podéis ejecutar y ver que pasa.


Para los que no tengan VB5 y quieran usar la utilidad (o para usarlo en un programa nuevo) :

- Abrir un nuevo proyecto y en 'Proyecto->Referencias' deberéis marcar la casilla de verificación correspondiente a 'ParamLC - Captación de parámetros'.
- Si no os aparece en la lista de componentes simplemente buscar el ParamLC.exe en el disco y seleccionarlo.


Por último, si tenéis que instalar un programa basado en esta utilidad en otro PC, no olvidéis incluir también este componente en los archivos de instalación como un componente compartido.

Bueno, ya está bien de literatura que tengo sueño y me estoy quedando dormido.

Saludos,

Nacho.


El código: (o parte de él, el resto está en el zip)

'
'Clase: "ParamLCCol"

Public Nombre As String
Public Valor As String


'Clase: "ParamLCCLass"

Public Function LeerParametros(LineaComandos As String) As Boolean
    LeerParametros = CaptarParametros(LineaComandos)
End Function

Public Function ValorParametro(NombreParametro As String) As String
    Dim Parametro
    
    ValorParametro = ""
    'Buscamos dentro de la colección 'Parametros' uno que tenga
    'el mismo nombre que el que solicitamos
    
    For Each Parametro In Parametros
        If UCase(Parametro.Nombre) = UCase(NombreParametro) Then
            ValorParametro = Parametro.Valor
            Exit For
        End If
    Next
    
End Function


'Módulo bas: "ParamLCMod"
Public Parametros As New Collection

Public Function CaptarParametros(LineaComandos As String) As Boolean
    
    Dim StrParametro As String
    Dim Contador As Integer
    Dim PosDosPuntos As Integer
    Dim SwEncontrado As Boolean
    Dim SWHayAlgo As Boolean
    Dim PrimByteNoSlash As Integer
   
    Do While Parametros.Count > 0
        Parametros.Remove 1
    Loop
    
    'Esta es la rutina que trata el string de la línea de comandos
    'y separa los parámetros según el siguiente convenio :
    '       /NombreParámetro1:Valor/NombreParámetro2:Valor/.....
    'Cada vez que encuentra una pareja nombre-valor lo guarda en una
    'colección interna sirviéndose de la clase ParamLCCol.
    
    CaptarParametros = False
    SWHayAlgo = False
    SwEncontrado = False
    PrimByteNoSlash = 1
    Do While Not SwEncontrado And PrimByteNoSlash < Len(LineaComandos)
        Do While PrimByteNoSlash < Len(LineaComandos)
            If Mid$(LineaComandos, PrimByteNoSlash, 1) <> "/" Then
                PrimByteNoSlash = PrimByteNoSlash + 1
            Else
                Exit Do
            End If
        Loop
        Do While PrimByteNoSlash < Len(LineaComandos)
            If Mid$(LineaComandos, PrimByteNoSlash, 1) = "/" Then
                PrimByteNoSlash = PrimByteNoSlash + 1
            Else
                SwEncontrado = True
                Exit Do
            End If
        Loop
    Loop
    
    Contador = Len(LineaComandos)
    Do While Contador >= PrimByteNoSlash - 1 And Contador > 0
        SwEncontrado = False
        Do While Not SwEncontrado And Contador >= PrimByteNoSlash - 1
            If Mid$(LineaComandos, Contador, 1) = ":" Then
                Do While Not SwEncontrado And Contador >= PrimByteNoSlash - 1
                    If Mid$(LineaComandos, Contador, 1) = "/" Then
                        SwEncontrado = True
                        SWHayAlgo = True
                        Exit Do
                    End If
                    Contador = Contador - 1
                Loop
            End If
            If Not SwEncontrado Then
                Contador = Contador - 1
            End If
        Loop
        If Contador >= PrimByteNoSlash - 1 Then
            'Definimos Parametro como ParamLCCol
            Dim Parametro As New ParamLCCol
            StrParametro = Right$(LineaComandos, Len(LineaComandos) - Contador + 1)
            LineaComandos = Left$(LineaComandos, Contador - 1)
            PosDosPuntos = InStr(1, StrParametro, ":")
            If PosDosPuntos < Len(StrParametro) Then
                Parametro.Valor = Mid$(StrParametro, PosDosPuntos + 1)
            Else
                Parametro.Valor = ""
            End If
            Parametro.Nombre = Mid$(StrParametro, 2, PosDosPuntos - 2)
            'Añadimos el nombre del parámetro y su valor a la
            'colección 'Parametros'
            Parametros.Add Parametro
            Set Parametro = Nothing
        End If
    Loop
    
    If SWHayAlgo Then
        CaptarParametros = True
    End If
End Function


ir al índice

Fichero con el código de ejemplo (param_nacho.zip 8.81 KB)