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í: 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
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 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! 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
' 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. 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! ::) 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... 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!¡.
|