Command$ extraer archivos.

Iniciado por LeandroA, 13 Febrero 2011, 18:43 PM

0 Miembros y 2 Visitantes están viendo este tema.

LeandroA

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.

seba123neo

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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Psyke1

#2
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

seba123neo

que yo sepa un nombre de archivo no puede tener comillas dobles...
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Psyke1

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

raul338

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

ignorantev1.1

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

LeandroA

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.



ignorantev1.1

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

LeandroA

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.