Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: LeandroA en 13 Febrero 2011, 18:43 PM

Título: Command$ extraer archivos.
Publicado por: LeandroA en 13 Febrero 2011, 18:43 PM
Hola una pregunta, como puedo obtener la lista de archivos de la linea de argumentos Command$

por ejemplo:
C:\Proyecto1.exe "C:\reto 123.exe" C:\imagen.png

cuando la ruta de un archivo tiene espacio windows pone " , de lo contrario solo separa un archivo de otro con espacios

cual es la logica para estraer los archivos de la linea de comando.

Saludos.
Título: Re: Command$ extraer archivos.
Publicado por: seba123neo en 13 Febrero 2011, 19:17 PM
Hola, Leandro, claro, pasa lo mismo cuando queres ejecutar un archivo desde un path con espacios desde el ejecutar de windows o desde la consola, para eso esta el path corto, pero me imagno que haciendo un split por los espacios y despues reemplazando las comillas no hay problema no ?

saludos.
Título: Re: Command$ extraer archivos.
Publicado por: Psyke1 en 13 Febrero 2011, 19:35 PM
Ya seba123neo, pero si el archivo lleva comillas? :rolleyes:
A mi se me ocurre algo así:

Código (vb) [Seleccionar]

Public Function GetFiles(ByVal strText As String) As Collection
Dim cTemp                       As New Collection
Dim oRegExp                     As Object
Dim oMatch                      As Object
Dim oMatches                    As Object

   Set oRegExp = CreateObject("VBScript.RegExp") 'Evitamos la referencia

   With oRegExp
       '// Sería similar a esta, lo único modificar los [\w\s\.] para que acepten algunos símbolos más... xP
       .Pattern = "\s?([\w\s\.]+\:\\([\w\s\.]+\\?)[\w\s\.]+(\.\w{1,})?)\s?"    '// No incluye verificación de ruta (pero... ¿no hace falta no?)
       .Global = True
       .IgnoreCase = True
   End With

   Set oMatches = oRegExp.Execute(strText)

   For Each oMatch In oMatches
       cTemp.Add oMatch.SubMatches(0)
   Next
   
   Set GetFiles = cTemp
End Function

Private Sub Form_Load()
Dim vItem                       As Variant
Const S                         As String = "C:\Frog\Proyecto1.exe ""C:\reto 123.exe"" C:\imagen.png"
   For Each vItem In GetFiles(S)
       MsgBox vItem
   Next
End Sub


Ojalá te sirva ;)

DoEvents! :P
Título: Re: Command$ extraer archivos.
Publicado por: seba123neo en 13 Febrero 2011, 19:38 PM
que yo sepa un nombre de archivo no puede tener comillas dobles...
Título: Re: Command$ extraer archivos.
Publicado por: Psyke1 en 13 Febrero 2011, 19:47 PM
Cita de: seba123neo en 13 Febrero 2011, 19:38 PM
que yo sepa un nombre de archivo no puede tener comillas dobles...
Oops :-X
Fallo mio... :xD
No me di cuenta, aún así mi manera es correcta :silbar:
Lo que queria decir es que si haces Split() para sacar los nombres usando " " como delimitador, te cortará el la ruta en trozos suponiendo que este lleve espacios dentro. :)

DoEvents! :P
Título: Re: Command$ extraer archivos.
Publicado por: raul338 en 13 Febrero 2011, 20:33 PM
Y no necesariamente tienen que estar la ruta entera del archivo. Hay programas que funcionan con archivos en el mismo directorio de trabajo, ej

C:\framework\proyecto1.exe archivo1.txt

archivo1.txt esta en la misma carpeta.

La logica seria primero extraer todo lo que esta entre comillas, y luego separar el resto por espacios :P
Título: Re: Command$ extraer archivos.
Publicado por: ignorantev1.1 en 13 Febrero 2011, 21:05 PM
Ahi va rusticamente  ;D
Código (vb) [Seleccionar]
Sub getFiles(ByVal args As String, res() As String)
    Dim i As Integer
    Dim e As Integer
    Dim sTmp As String
   
    i = InStr(args, Chr$(34))
    While i > 0
        e = InStr(i + 1, args, Chr$(34))
        sTmp = Mid(args, i, e)
        args = Replace(args, sTmp, Replace(Mid(sTmp, 2, Len(sTmp) - 2), " ", "|"))
        i = InStr(e, args, Chr$(34))
    Wend
    args = Replace(args, " ", "*")
    args = Replace(args, "|", " ")
    res = Split(args, "*")
    e = 0
    For i = 0 To UBound(res) - 1
        If res(i + 1) = "" Then
            i = i + 1
        ElseIf res(i) = "" Then
            res(i) = res(i + 1)
            i = i - 1
            e = e + 1
        End If
    Next
    If e > 0 Then
        ReDim Preserve res(e - 1)
    Else
        'Erase res <----
        ReDim res(0)
    End If
End Sub
Título: Re: Command$ extraer archivos.
Publicado por: LeandroA en 13 Febrero 2011, 21:47 PM
Hola, no funcionan,  la de ignorantev1.1  no me devuelve nada, y la de Mr. Frog me esta devolviendo el path y cortado

proba con este ejemplo

"C:\Documents and Settings\Administrador\Escritorio\proRegEdit.exe" "C:\Documents and Settings\Administrador\Escritorio\MSNOIE8_ESES_XP.EXE"

Saludos.


Título: Re: Command$ extraer archivos.
Publicado por: ignorantev1.1 en 13 Febrero 2011, 22:05 PM
Disculpa LeandroA tenia un errocito  ;) listo!
Código (vb) [Seleccionar]
Sub getFiles(ByVal args As String, res() As String)
    Dim i As Integer
    Dim e As Integer
    Dim sTmp As String

    i = InStr(args, Chr$(34))
    While i > 0
        e = InStr(i + 1, args, Chr$(34))
        sTmp = Mid(args, i, e)
        args = Replace(args, sTmp, Replace(Mid(sTmp, 2, Len(sTmp) - 2), " ", "|"))
        i = InStr(e, args, Chr$(34))
    Wend
    args = Replace(args, " ", "*")
    args = Replace(args, "|", " ")
    res = Split(args, "*")
    e = -1
    For i = 0 To UBound(res) - 1
        If res(i + 1) = "" Then
            i = i + 1
        ElseIf res(i) = "" Then
            res(i) = res(i + 1)
            i = i - 1
            e = e + 1
        End If
    Next
    If e > 0 Then
        ReDim Preserve res(e - 1)
    ElseIf e = 0 Then
        'Erase res <----
        ReDim res(0)
    End If
End Sub
Título: Re: Command$ extraer archivos.
Publicado por: LeandroA en 13 Febrero 2011, 22:42 PM
jaj es complicado ahora fijate que con el primer ejemplo no funciona
C:\Proyecto1.exe "C:\reto 123.exe" C:\imagen.png

yo lo intente pero me saco.
Título: Re: Command$ extraer archivos.
Publicado por: raul338 en 13 Febrero 2011, 22:52 PM
Código (vb) [Seleccionar]

' Mr Frog Mod Raul338 - Le cambie la RegExp
Public Function GetFiles(ByVal strText As String) As Collection
Dim cTemp                       As New Collection
Dim oRegExp                     As Object
Dim oMatch                      As Object
Dim oMatches                    As Object

    Set oRegExp = CreateObject("VBScript.RegExp")

    With oRegExp
        .Pattern = "\s?(\""[\w\s:\\\.]+\""|[\w\s:\\\.]+)\s?"
        .Global = True
        .IgnoreCase = True
    End With

    Set oMatches = oRegExp.Execute(strText)

    For Each oMatch In oMatches
        cTemp.Add oMatch.SubMatches(0)
    Next

    Set GetFiles = cTemp
End Function

Private Sub Form_Load()
Dim vItem                       As Variant
Const S                         As String = "C:\Frog\Proyecto1.exe ""C:\reto 123.exe"" C:\imagen.png"
    For Each vItem In GetFiles(S)
        MsgBox vItem
    Next
End Sub

;-)
Título: Re: Command$ extraer archivos.
Publicado por: seba123neo en 13 Febrero 2011, 23:04 PM
raul338 creo que sigue manteniendo las comillas.

Leandro probaste la api CommandLineToArgv ? aca te paso un ejemplo, funciona con caracteres especiales y comillas simples.

Código (vb) [Seleccionar]
Option Explicit

Private Type MungeLong
   X As Long
   Dummy As Integer
End Type

Private Type MungeInt
   XLo As Integer
   XHi As Integer
   Dummy As Integer
End Type

Private Declare Function CommandLineToArgv Lib "shell32" Alias "CommandLineToArgvW" (ByVal lpCmdLine As String, pNumArgs As Integer) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32" (dest As Any, src As Any, ByVal size&)
Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyW" (RetVal As Byte, ByVal Ptr As Long) As Long
Private Declare Function PtrToInt Lib "kernel32" Alias "lstrcpynW" (RetVal As Any, ByVal Ptr As Long, ByVal nCharCount As Long) As Long
Private Declare Function StrLen Lib "kernel32" Alias "lstrlenW" (ByVal Ptr As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
   
Private Sub Form_Load()
    Dim sarCommand() As String, lngA As Long
   
    sarCommand = ParseCommandLine
   
    For lngA = 0 To UBound(sarCommand)
        MsgBox sarCommand(lngA)
    Next lngA
End Sub

Public Function ParseCommandLine() As String()
   Dim sCommandLineW As String
   Dim BufPtr As Long
   Dim lNumArgs As Integer
   Dim i As Long
   Dim lRes As Long
   Dim TempPtr As MungeLong
   Dim TempStr As MungeInt
   Dim ArgArray(512) As Byte
   Dim Arg As String
   Dim Args() As String

   sCommandLineW = StrConv("C:\Proyecto1.exe ""C:\reto 123.exe"" C:\imagen.png archivo.txt aaa.txt aadada#&%''.txt", vbUnicode)
   BufPtr = CommandLineToArgv(sCommandLineW, lNumArgs)
   ReDim Args(lNumArgs - 1)

   For i = 1 To lNumArgs
       lRes = PtrToInt(TempStr.XLo, BufPtr + (i - 1) * 4, 2)
       lRes = PtrToInt(TempStr.XHi, BufPtr + (i - 1) * 4 + 2, 2)
       LSet TempPtr = TempStr
       lRes = PtrToStr(ArgArray(0), TempPtr.X)
       Arg = Left(ArgArray, StrLen(TempPtr.X))
       Args(i - 1) = Arg
   Next i

   Call GlobalFree(BufPtr)
   ParseCommandLine = Args
End Function

Public Function IsEmptyArray(TestArray As Variant) As Boolean
   Dim lTemp As Long
   On Error GoTo ErrHandler
   lTemp = LBound(TestArray)
   IsEmptyArray = False
   Exit Function
ErrHandler:
   IsEmptyArray = True
End Function


saludos.

Título: Re: Command$ extraer archivos.
Publicado por: LeandroA en 13 Febrero 2011, 23:13 PM
Muy bueno seba123neo  tampoco tenia en cuenta los caracteres especiales. la de Raul funciona pero lo limita los caracteres especiales.

Muchisimas gracias a todos.

Título: Re: Command$ extraer archivos.
Publicado por: ignorantev1.1 en 13 Febrero 2011, 23:51 PM
No me doy por vencido!  ::)
Código (vb) [Seleccionar]
Sub getFiles(ByVal args As String, res() As String)
    Dim i As Integer
    Dim e As Integer
    Dim sTmp As String

    i = InStr(args, Chr$(34))
    e = InStr(i + 1, args, Chr$(34))
    While i > 0 And e > 0
        sTmp = Mid(args, i, e - i + 1)
        args = Replace(args, sTmp, Replace(Mid(sTmp, 2, Len(sTmp) - 2), " ", "|") & ":")
        i = InStr(e, args, Chr$(34))
        e = InStr(i + 1, args, Chr$(34))
    Wend
    If Len(args) = 0 Then args = ":"
    args = Replace$(args, "  ", "")
    args = Replace$(args, " ", ":")
    args = Replace$(args, "::", ":")
    If Mid$(args, Len(args), 1) = ":" Then args = Mid$(args, 1, Len(args) - 1)
    args = Replace$(args, "|", " ")
    res = Split(args, ":")
End Sub
Título: Re: Command$ extraer archivos.
Publicado por: BlackZeroX en 14 Febrero 2011, 00:57 AM
.

Otra forma...

Código (vb) [Seleccionar]


Option Explicit

Private Sub Form_Load()
Dim v$()
Dim int_i%
    For int_i% = 0 To GetArgs(InputBox("", "", ""), v$())
        Debug.Print v$(int_i%)
    Next
End Sub

Public Function GetArgs(ByRef cmd$, ByRef Args$()) As Integer
Dim lng_ptr&(2)
Dim lng_str&
Dim lng_i&
Dim byt_asc As Byte
   
    lng_str& = Len(cmd$)
    GetArgs% = -1
   
    For lng_i& = 1 To lng_str&
   
        lng_ptr&(0) = InStr(lng_i&, cmd$, Chr(32), vbBinaryCompare)
        lng_ptr&(1) = InStr(lng_i&, cmd$, Chr(34), vbBinaryCompare)
       
        If Not lng_ptr&(0) + 1 = lng_ptr&(1) Then
            If lng_ptr&(0) < lng_ptr&(1) Or lng_ptr&(1) = 0 And Not lng_ptr&(0) = 0 Then
                lng_i& = lng_ptr&(0) + 1
                byt_asc = 32
            ElseIf lng_ptr&(1) < lng_ptr&(0) Or lng_ptr&(0) = 0 And Not lng_ptr&(1) = 0 Then
                lng_i& = lng_ptr&(1) + 1
                byt_asc = 34
            Else
                Exit For
            End If
           
            lng_ptr(2) = InStr(lng_i&, cmd$, Chr(byt_asc), vbBinaryCompare)
           
            If Not lng_ptr(2) = lng_i& - 1 Then
                GetArgs% = GetArgs% + 1
                ReDim Preserve Args(0 To GetArgs%)
               
                If lng_ptr(2) > lng_i& Then
                    Args$(GetArgs%) = Mid$(cmd$, lng_i&, lng_ptr&(2) - lng_i&)
                    If byt_asc = 32 Then lng_ptr&(2) = lng_ptr&(2) - 1
                    lng_i& = lng_ptr&(2)
                Else
                    Args$(GetArgs%) = Mid$(cmd$, lng_i&)
                    Exit For
                End If
            End If
        End If
    Next
   
End Function



Ducles Lunas!¡.