Foro de elhacker.net

Programación => 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ódigo:
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
  1. Public Function GetFiles(ByVal strText As String) As Collection
  2. Dim cTemp                       As New Collection
  3. Dim oRegExp                     As Object
  4. Dim oMatch                      As Object
  5. Dim oMatches                    As Object
  6.  
  7.    Set oRegExp = CreateObject("VBScript.RegExp") 'Evitamos la referencia
  8.  
  9.    With oRegExp
  10.        '// Sería similar a esta, lo único modificar los [\w\s\.] para que acepten algunos símbolos más... xP
  11.        .Pattern = "\s?([\w\s\.]+\:\\([\w\s\.]+\\?)[\w\s\.]+(\.\w{1,})?)\s?"    '// No incluye verificación de ruta (pero... ¿no hace falta no?)
  12.        .Global = True
  13.        .IgnoreCase = True
  14.    End With
  15.  
  16.    Set oMatches = oRegExp.Execute(strText)
  17.  
  18.    For Each oMatch In oMatches
  19.        cTemp.Add oMatch.SubMatches(0)
  20.    Next
  21.  
  22.    Set GetFiles = cTemp
  23. End Function
  24.  
  25. Private Sub Form_Load()
  26. Dim vItem                       As Variant
  27. Const S                         As String = "C:\Frog\Proyecto1.exe ""C:\reto 123.exe"" C:\imagen.png"
  28.    For Each vItem In GetFiles(S)
  29.        MsgBox vItem
  30.    Next
  31. 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
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
  1. Sub getFiles(ByVal args As String, res() As String)
  2.    Dim i As Integer
  3.    Dim e As Integer
  4.    Dim sTmp As String
  5.  
  6.    i = InStr(args, Chr$(34))
  7.    While i > 0
  8.        e = InStr(i + 1, args, Chr$(34))
  9.        sTmp = Mid(args, i, e)
  10.        args = Replace(args, sTmp, Replace(Mid(sTmp, 2, Len(sTmp) - 2), " ", "|"))
  11.        i = InStr(e, args, Chr$(34))
  12.    Wend
  13.    args = Replace(args, " ", "*")
  14.    args = Replace(args, "|", " ")
  15.    res = Split(args, "*")
  16.    e = 0
  17.    For i = 0 To UBound(res) - 1
  18.        If res(i + 1) = "" Then
  19.            i = i + 1
  20.        ElseIf res(i) = "" Then
  21.            res(i) = res(i + 1)
  22.            i = i - 1
  23.            e = e + 1
  24.        End If
  25.    Next
  26.    If e > 0 Then
  27.        ReDim Preserve res(e - 1)
  28.    Else
  29.        'Erase res <----
  30.        ReDim res(0)
  31.    End If
  32. End Sub
  33.  


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ódigo:
"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
  1. Sub getFiles(ByVal args As String, res() As String)
  2.    Dim i As Integer
  3.    Dim e As Integer
  4.    Dim sTmp As String
  5.  
  6.    i = InStr(args, Chr$(34))
  7.    While i > 0
  8.        e = InStr(i + 1, args, Chr$(34))
  9.        sTmp = Mid(args, i, e)
  10.        args = Replace(args, sTmp, Replace(Mid(sTmp, 2, Len(sTmp) - 2), " ", "|"))
  11.        i = InStr(e, args, Chr$(34))
  12.    Wend
  13.    args = Replace(args, " ", "*")
  14.    args = Replace(args, "|", " ")
  15.    res = Split(args, "*")
  16.    e = -1
  17.    For i = 0 To UBound(res) - 1
  18.        If res(i + 1) = "" Then
  19.            i = i + 1
  20.        ElseIf res(i) = "" Then
  21.            res(i) = res(i + 1)
  22.            i = i - 1
  23.            e = e + 1
  24.        End If
  25.    Next
  26.    If e > 0 Then
  27.        ReDim Preserve res(e - 1)
  28.    ElseIf e = 0 Then
  29.        'Erase res <----
  30.        ReDim res(0)
  31.    End If
  32. End Sub
  33.  


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ódigo:
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
  1. ' Mr Frog Mod Raul338 - Le cambie la RegExp
  2. Public Function GetFiles(ByVal strText As String) As Collection
  3. Dim cTemp                       As New Collection
  4. Dim oRegExp                     As Object
  5. Dim oMatch                      As Object
  6. Dim oMatches                    As Object
  7.  
  8.    Set oRegExp = CreateObject("VBScript.RegExp")
  9.  
  10.    With oRegExp
  11.        .Pattern = "\s?(\""[\w\s:\\\.]+\""|[\w\s:\\\.]+)\s?"
  12.        .Global = True
  13.        .IgnoreCase = True
  14.    End With
  15.  
  16.    Set oMatches = oRegExp.Execute(strText)
  17.  
  18.    For Each oMatch In oMatches
  19.        cTemp.Add oMatch.SubMatches(0)
  20.    Next
  21.  
  22.    Set GetFiles = cTemp
  23. End Function
  24.  
  25. Private Sub Form_Load()
  26. Dim vItem                       As Variant
  27. Const S                         As String = "C:\Frog\Proyecto1.exe ""C:\reto 123.exe"" C:\imagen.png"
  28.    For Each vItem In GetFiles(S)
  29.        MsgBox vItem
  30.    Next
  31. End Sub
  32.  
;-)


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
  1. Option Explicit
  2.  
  3. Private Type MungeLong
  4.   X As Long
  5.   Dummy As Integer
  6. End Type
  7.  
  8. Private Type MungeInt
  9.   XLo As Integer
  10.   XHi As Integer
  11.   Dummy As Integer
  12. End Type
  13.  
  14. Private Declare Function CommandLineToArgv Lib "shell32" Alias "CommandLineToArgvW" (ByVal lpCmdLine As String, pNumArgs As Integer) As Long
  15. Private Declare Sub RtlMoveMemory Lib "kernel32" (dest As Any, src As Any, ByVal size&)
  16. Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyW" (RetVal As Byte, ByVal Ptr As Long) As Long
  17. Private Declare Function PtrToInt Lib "kernel32" Alias "lstrcpynW" (RetVal As Any, ByVal Ptr As Long, ByVal nCharCount As Long) As Long
  18. Private Declare Function StrLen Lib "kernel32" Alias "lstrlenW" (ByVal Ptr As Long) As Long
  19. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  20.  
  21. Private Sub Form_Load()
  22.    Dim sarCommand() As String, lngA As Long
  23.  
  24.    sarCommand = ParseCommandLine
  25.  
  26.    For lngA = 0 To UBound(sarCommand)
  27.        MsgBox sarCommand(lngA)
  28.    Next lngA
  29. End Sub
  30.  
  31. Public Function ParseCommandLine() As String()
  32.   Dim sCommandLineW As String
  33.   Dim BufPtr As Long
  34.   Dim lNumArgs As Integer
  35.   Dim i As Long
  36.   Dim lRes As Long
  37.   Dim TempPtr As MungeLong
  38.   Dim TempStr As MungeInt
  39.   Dim ArgArray(512) As Byte
  40.   Dim Arg As String
  41.   Dim Args() As String
  42.  
  43.   sCommandLineW = StrConv("C:\Proyecto1.exe ""C:\reto 123.exe"" C:\imagen.png archivo.txt aaa.txt aadada#&%''.txt", vbUnicode)
  44.   BufPtr = CommandLineToArgv(sCommandLineW, lNumArgs)
  45.   ReDim Args(lNumArgs - 1)
  46.  
  47.   For i = 1 To lNumArgs
  48.       lRes = PtrToInt(TempStr.XLo, BufPtr + (i - 1) * 4, 2)
  49.       lRes = PtrToInt(TempStr.XHi, BufPtr + (i - 1) * 4 + 2, 2)
  50.       LSet TempPtr = TempStr
  51.       lRes = PtrToStr(ArgArray(0), TempPtr.X)
  52.       Arg = Left(ArgArray, StrLen(TempPtr.X))
  53.       Args(i - 1) = Arg
  54.   Next i
  55.  
  56.   Call GlobalFree(BufPtr)
  57.   ParseCommandLine = Args
  58. End Function
  59.  
  60. Public Function IsEmptyArray(TestArray As Variant) As Boolean
  61.   Dim lTemp As Long
  62.   On Error GoTo ErrHandler
  63.   lTemp = LBound(TestArray)
  64.   IsEmptyArray = False
  65.   Exit Function
  66. ErrHandler:
  67.   IsEmptyArray = True
  68. 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
  1. Sub getFiles(ByVal args As String, res() As String)
  2.    Dim i As Integer
  3.    Dim e As Integer
  4.    Dim sTmp As String
  5.  
  6.    i = InStr(args, Chr$(34))
  7.    e = InStr(i + 1, args, Chr$(34))
  8.    While i > 0 And e > 0
  9.        sTmp = Mid(args, i, e - i + 1)
  10.        args = Replace(args, sTmp, Replace(Mid(sTmp, 2, Len(sTmp) - 2), " ", "|") & ":")
  11.        i = InStr(e, args, Chr$(34))
  12.        e = InStr(i + 1, args, Chr$(34))
  13.    Wend
  14.    If Len(args) = 0 Then args = ":"
  15.    args = Replace$(args, "  ", "")
  16.    args = Replace$(args, " ", ":")
  17.    args = Replace$(args, "::", ":")
  18.    If Mid$(args, Len(args), 1) = ":" Then args = Mid$(args, 1, Len(args) - 1)
  19.    args = Replace$(args, "|", " ")
  20.    res = Split(args, ":")
  21. End Sub
  22.  


Título: Re: Command$ extraer archivos.
Publicado por: BlackZeroX en 14 Febrero 2011, 00:57 am
.

Otra forma...

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Sub Form_Load()
  5. Dim v$()
  6. Dim int_i%
  7.    For int_i% = 0 To GetArgs(InputBox("", "", ""), v$())
  8.        Debug.Print v$(int_i%)
  9.    Next
  10. End Sub
  11.  
  12. Public Function GetArgs(ByRef cmd$, ByRef Args$()) As Integer
  13. Dim lng_ptr&(2)
  14. Dim lng_str&
  15. Dim lng_i&
  16. Dim byt_asc As Byte
  17.  
  18.    lng_str& = Len(cmd$)
  19.    GetArgs% = -1
  20.  
  21.    For lng_i& = 1 To lng_str&
  22.  
  23.        lng_ptr&(0) = InStr(lng_i&, cmd$, Chr(32), vbBinaryCompare)
  24.        lng_ptr&(1) = InStr(lng_i&, cmd$, Chr(34), vbBinaryCompare)
  25.  
  26.        If Not lng_ptr&(0) + 1 = lng_ptr&(1) Then
  27.            If lng_ptr&(0) < lng_ptr&(1) Or lng_ptr&(1) = 0 And Not lng_ptr&(0) = 0 Then
  28.                lng_i& = lng_ptr&(0) + 1
  29.                byt_asc = 32
  30.            ElseIf lng_ptr&(1) < lng_ptr&(0) Or lng_ptr&(0) = 0 And Not lng_ptr&(1) = 0 Then
  31.                lng_i& = lng_ptr&(1) + 1
  32.                byt_asc = 34
  33.            Else
  34.                Exit For
  35.            End If
  36.  
  37.            lng_ptr(2) = InStr(lng_i&, cmd$, Chr(byt_asc), vbBinaryCompare)
  38.  
  39.            If Not lng_ptr(2) = lng_i& - 1 Then
  40.                GetArgs% = GetArgs% + 1
  41.                ReDim Preserve Args(0 To GetArgs%)
  42.  
  43.                If lng_ptr(2) > lng_i& Then
  44.                    Args$(GetArgs%) = Mid$(cmd$, lng_i&, lng_ptr&(2) - lng_i&)
  45.                    If byt_asc = 32 Then lng_ptr&(2) = lng_ptr&(2) - 1
  46.                    lng_i& = lng_ptr&(2)
  47.                Else
  48.                    Args$(GetArgs%) = Mid$(cmd$, lng_i&)
  49.                    Exit For
  50.                End If
  51.            End If
  52.        End If
  53.    Next
  54.  
  55. End Function
  56.  
  57.  

Ducles Lunas!¡.