Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: WestOn en 18 Octubre 2008, 11:02 am



Título: es posible...? (Consola)
Publicado por: WestOn en 18 Octubre 2008, 11:02 am
wenas, toy creando una consola y se me ocurrio empezar a añadirle ya comandos.
Mi pregunta es como puedo hacer esto:
Comando: RD /S /Q, bien al poner eso en la consola no soy capaz de hacer que interprete los modificadores /S /Q y encima tampoco reconoce RD ya que despues hay mas palabras.
mi idea esque cada vez que haya un espacio la palabra que siga sea una variable(ahora mismo lo tengo todo en una variable):
A=ConsoleReadLine asi es como funciona, y entonces una vez hecho eso ¿como puedo hacer que reconozca los espacios?  EJ:
Código:
Clean  _  /e  _  /r   (comandos fantasiosos)
   |      |      |
   v      v      v
 Var1   Var2   Var3

 _ = espacio

Por cada espacio seguido de una letra que lo identifique como una variable..

espero que se haya entendido...un saludo y grax de antemano



Título: Re: es posible...?
Publicado por: aaronduran2 en 18 Octubre 2008, 12:51 pm
Utiliza la función Split para separar el comando de los argumentos.

Saludos.


Título: Re: es posible...?
Publicado por: Spider-Net en 18 Octubre 2008, 12:52 pm
Con la función Split.

Código
  1. Dim A As String
  2. Dim v As Variant
  3.  
  4. A = "Clean /e /r"
  5. v = Split(A, " ")
  6.  
  7. 'v(0) = Clean
  8. 'v(1) = /e
  9. 'v(2) = /r
  10. 'Ejemplo:
  11. Dim i As Integer
  12. For i = 0 To 2
  13.    MsgBox v(i) & " es el parámetro " & i
  14. Next

Saludos!

aaronduran2 ha posteado mientras lo hacia yo, pero bueno ya te dejo el ejemplo


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 13:59 pm
grax!!  :laugh: voy a probarlo yaaaa ;D


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 14:37 pm
No entiendo bien el code  :(, lo he intentado poner en un form nuevo para probarlo pero me saltan errores.
si puedes poner un ejemplo mas explicado o algo asi...:xD

un saludo y grax  ;D

PD:cuando poneis un code sale con colores y muy bonito, ¿como lo haceis xD?(los q pongo yo noo :¬¬)  ;)


Título: Re: es posible...?
Publicado por: aaronduran2 en 18 Octubre 2008, 14:49 pm
Imagínate que tienes una variable con el texto "Hola /a /b /c".

Pues para separarlo utilizas Split, de forma que quedaría así:

Código
  1. Option Explicit
  2.  
  3. Dim i As Integer
  4. Dim s_Texto As String
  5. Dim v_Argumentos As Variant
  6.  
  7. s_Texto = "Hola /a /b /c"
  8. v_Argumentos = Split(s_Texto, " ")
  9.  
  10. For i = 0 To 2
  11.    MsgBox "Argumento: " & v_Argumentos(i)
  12. Next

Es lo mismo que puso Spider-Net. El error posiblemente se deba a que tienes Option Explicit y no se declara la variable i.

Para poner el código coloreado, utiliza las etiquetas GeSHi. Cuando posteas algo, arriba a la derecha tienes un menú desplegable que te permite añadir las etiquetas para los diferentes lenguajes.

Saludos.


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 15:02 pm
Grax a los dos ;), ok lo he puesto y me detecta el primer argumento clear, pero al poner en la consola clear /q /u no me salta el mensaje, sera porq teng que declarar los parametros no?
xD donde los declaro¿?
Código
  1. If a = "clear" Then
  2. v = Split(a, " ")
  3. For i = 0 To 2
  4. MsgBox "Argumento: " & v(i)
  5. Next
  6. End If
asi es como detecta la consola los comandos que pongo, esta bien asi o creeis que hay mejores formas XD?

un saludo


Título: Re: es posible...?
Publicado por: cassiani en 18 Octubre 2008, 15:29 pm
Bueno amigo, la cadena "clear" es diferente de la cadena "clear /q /u", en este caso lo que puedes hacer es buscar la cadena "clear" dentro de la cadena que recibes "Instr".

Y te sale hacer uso de "UBound".

Saludos!!


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 16:20 pm
wenas, ya se q es diferente ajaja :xD :xD , voy a hacer eso q has dicho de buscar la palabra dentro de la cadena y una vez encontrado que busque los modificadores ;) es buena

por ciero lo de "UBound" lo he buscado en el vb y no me sale ninguna referencia

un saludo


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 17:26 pm
wenas de nuevo, he estado mirando y no tengo nada para buscar palabras (me sonaba que tenia alguna funcion en un modulo...) pero nose si no la tengo o esta perdida por alguna parte  :-\
alguien tiene algo a mano?

un saludo


Título: Re: es posible...?
Publicado por: Spider-Net en 18 Octubre 2008, 18:03 pm
 :huh: :huh: :huh: :huh: :huh:

InStr


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 18:32 pm
wenas, ya Spider-Net pero nunca he usado la funcion que has puesto, y he estado mirando la msdn online pero no soy capaz de hacerlo funcionar en la consola..

ttp://msdn.microsoft.com/es-es/library/8460tsh1(VS.80).aspx (http://ttp://msdn.microsoft.com/es-es/library/8460tsh1(VS.80).aspx) le falta una H al principio.
si me pones un pequeño ejemplo (q no parecido el de la pag, q ademas no me funciona xDD) te lo agradeceria ;)

bueno venga un saludo


Título: Re: es posible...?
Publicado por: seba123neo en 18 Octubre 2008, 18:48 pm
Hola WestOn todas esas dudas Instr ,Ubound estan en un manual de visual basic...esa pagina es de visual basic .NET...digamos que es lo mismo..pero algunas funciones cambian y por eso es mejor mirar algo de visual basic 6...

saludos.


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 19:05 pm
ya decia yo  :-X, ok voy a mirar el tuto del guille que seguro estaran esas funciones.. ahora cuando lo haga dejare un pequeño ejemplo por si alguien lo quiere

un saludoo


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 19:37 pm
wenas, haber he hecho este ejemplo bien sencillo pero me salta un error ("se esperaba =")
Código
  1. Option Explicit
  2. Dim a As String
  3. Private Sub Command1_Click()
  4. InStr(a, "clear", vbTextCompare) 'Aqui salta el error
  5. End Sub
  6.  
  7. Private Sub Form_Load()
  8. a = "dgh ttdx tnh ck bd tbs xjthm cn clear rgtfc txvhtxv"
  9. End Sub
  10.  

si no entendi mal InStr lee desde el inicio la variable, busca la palabra 'clear', y la ultima opcion es para comparar texto, ¿que me falla?

un saludo y grax de antemano


Título: Re: es posible...?
Publicado por: seba123neo en 18 Octubre 2008, 19:46 pm
pues claro..el Instr se le tiene qeu pasar a una variable o lo tenes que comparar con un if o con un msgbox lo podes mostrar..no lo podes poner asi nomas...el Instr devuelve un integer ..si es 0 no encontro la palabra y si es desigual a 0 te devuelve la posicion en la que la cadena que buscaste se encuentra..mira:

Código
  1. Option Explicit
  2. Dim a As String
  3.  
  4. Private Sub Command1_Click()
  5. MsgBox InStr(a, "clear")
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9. a = "dgh ttdx tnh ck bd tbs xjthm cn clear rgtfc txvhtxv"
  10. End Sub

ahi te devuelve 33 qeu es la posicion de la palabra "Clear" que buscas...en vez de un msgbox podes poner una variable y hacer un if asi:

Código
  1. Option Explicit
  2. Dim a As String
  3. Dim i As Integer
  4.  
  5. Private Sub Command1_Click()
  6. i = InStr(a, "clear")
  7. If i = 0 Then
  8.    MsgBox "no se encontro la palabra"
  9. Else
  10.    MsgBox "se encontro la palabra en la posicion " & i
  11. End If
  12. End Sub
  13.  
  14. Private Sub Form_Load()
  15. a = "dgh ttdx tnh ck bd tbs xjthm cn clear rgtfc txvhtxv"
  16. End Sub

saludos.



Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 20:07 pm
grax seba123neo, yo creo que ya con esto puedo seguir con lo de la consola ;D

un saludo


Título: Re: es posible...?
Publicado por: WestOn en 18 Octubre 2008, 21:16 pm
Wenas, aqui esta este ejemplo q funciona  :xD, poner 1 commandbotton & un text :
Código
  1. Option Explicit
  2. Dim a As String, z
  3. Dim i As Integer
  4. Private Sub Command1_Click()
  5. a = Text1
  6. z = 0
  7. If z = 0 Then
  8. i = InStr(a, "clean /s")
  9. If i = 0 Then
  10. 'no ta
  11. Else
  12. i = InStr(a, "/q")
  13. If i = 0 Then
  14. MsgBox "Clean /S", vbInformation, "info"
  15. Else
  16. MsgBox "Clean /S /Q", vbInformation, "info"
  17. End If
  18. End If
  19. End If
  20. End Sub
  21.  
el problema esque no es capaz de reconocer el comando /q solo, ¿alguna idea?
saludoss


Título: Re: es posible...? (Consola)
Publicado por: Spider-Net en 18 Octubre 2008, 22:15 pm
¿Pero por qué no usas el split que es mucho más fácil? Y un consejo compañero, acostúmbrate a tabular (indentar) tu código porque es más fácil de comprender:

A ver, un ejemplo:

Código
  1. 'Ejemplo de uso de Split para separar comandos
  2. 'Por Auron
  3. 'Espero que lo entiendas bien esta vez
  4. Option Explicit
  5. Dim a, resultado As String
  6. Dim i, contador As Integer
  7. Dim v As Variant
  8.  
  9. Private Sub Command1_Click()
  10. a = Text1.Text 'Se almacena en a la cadena
  11. v = Split(a, " ") 'Se separa cada parametro con un split
  12.  
  13. 'v(0) = primer parametro
  14. 'v(1) = segundo parametro
  15. 'v(2) = tercer parametro... etc
  16.  
  17.  
  18. 'Se cuenta el numero de espacios que hay en el texto, así sabremos
  19. 'cuantos parámetros hay, porque entre cada parámetro ha de haber un espacio
  20. For i = 1 To Len(a)
  21.    If Mid(a, i, 1) = " " Then
  22.        contador = contador + 1 'contador almacena el número de espacios
  23.    End If
  24. Next
  25.  
  26. 'Si el primer parametro es el comando clean entramos
  27. If LCase(v(0)) = "clean" Then
  28.    resultado = "clean" 'asignamos el resultado clean
  29.  
  30.    'Si contador es mayor o igual que 1 es que hay uno o más parámetros
  31.    If contador >= 1 Then
  32.        If LCase(v(1)) = "/q" Then
  33.            resultado = resultado & " /q" 'Si el parámetro 1 es /q se almacena en resultado
  34.        ElseIf LCase(v(1)) = "/s" Then
  35.            resultado = resultado & " /s" 'Si el parámetro 1 es /s se almacena en resultado
  36.        End If
  37.    End If
  38.  
  39.    'Si contador es mayor o igual que 2 es que hay dos o más parametros
  40.    If contador >= 2 Then
  41.        If LCase(v(2)) = "/q" Then
  42.            resultado = resultado & " /q" 'Si el parámetro 2 es /q se almacena en resultado
  43.        ElseIf LCase(v(2)) = "/s" Then
  44.            resultado = resultado & " /s" 'Si el parámetro 2 es /s se almacena en resultado
  45.        End If
  46.    End If
  47.  
  48.    'Mostramos el resultado
  49.    MsgBox "El comando resultante es: " & resultado, vbInformation, "Resultado"
  50. End If
  51. End Sub


Título: Re: es posible...? (Consola)
Publicado por: WestOn en 18 Octubre 2008, 22:29 pm
wenas, esque lo del split tampoco lo he usado nunca y tenia que mirar tambien lo del InStr... :P
Lo de identar el code me ha sido imposible...(tenia otra idea en la cabeza, primer post) pero lo q vosotros decis esq esta mejor, voy a probar el ejemplo grax Spider-Net


Título: Re: es posible...? (Consola)
Publicado por: Spider-Net en 18 Octubre 2008, 22:33 pm
wenas, esque lo del split tampoco lo he usado nunca y tenia que mirar tambien lo del InStr... :P
Lo de identar el code me ha sido imposible...(tenia otra idea en la cabeza, primer post) pero lo q vosotros decis esq esta mejor, voy a probar el ejemplo grax Spider-Net

Identar es tabularlo, sólo poner tabuladores para saber que instrucciones se ejecutan dentro de cada procedimiento.

Saludos


Título: Re: es posible...? (Consola)
Publicado por: WestOn en 18 Octubre 2008, 22:53 pm
aaaaaa  :laugh:...pensaba q decias idear,crear o algo asi

Esta perfecto el code ::)

Un saludo ;D


Título: Re: es posible...? (Consola)
Publicado por: cassiani en 19 Octubre 2008, 01:10 am
Como ya te dijeron, léete un manual básico sobre todo el manejo de cadenas (que te hace mucha falta) o caerás acá preguntando lo mismo una y otra vez.

Para lo que hacías, yo lo haría así:

Código
  1. Option Explicit
  2. Dim sCadena    As String
  3. Dim sCacho()   As String
  4. Dim sResultado As String
  5. Dim I          As Integer
  6.  
  7. Private Sub Cmd_Click()
  8.    sCadena = Trim$(Text1.Text)
  9.    sCacho = Split(sCadena, " ")
  10.  
  11.    sResultado = ""
  12.  
  13.    For I = 0 To UBound(sCacho)
  14.        Select Case (LCase$(sCacho(I)))
  15.            Case "clean": sResultado = sResultado & sCacho(I) & " "
  16.            Case "/q": sResultado = sResultado & sCacho(I) & " "
  17.            Case "/s": sResultado = sResultado & sCacho(I) & " "
  18.        End Select
  19.    Next
  20.  
  21.    MsgBox sResultado
  22. End Sub

Y hay, más case para más parámetros y dentro de los case las rutinas o funciones que se requieran.


http://www.elguille.info/vb/vb6/stringFunctions.htm (http://www.elguille.info/vb/vb6/stringFunctions.htm)

http://www.recursosvisualbasic.com.ar/htm/tutoriales/tutorial-basico5.htm (http://www.recursosvisualbasic.com.ar/htm/tutoriales/tutorial-basico5.htm)

saludos!!


Título: Re: es posible...? (Consola)
Publicado por: Spider-Net en 19 Octubre 2008, 12:11 pm
El ejemplo de cΔssiΔnі está mucho mejor que el mío. Además usó la función Trim para eliminar posibles espacios al final o al principio del comando introducidos por error.Así que te recomiendo que uses su ejemplo.

Un saludo!


Título: Re: es posible...? (Consola)
Publicado por: WestOn en 19 Octubre 2008, 13:35 pm
wenas, esta bien el code, voy a ver como lo uso en el proyecto y cuando termine cuelgo el proyecto para que le echeis una ojeada (ya q el 'motor' del exe es vuestro ajajaj) aver si no tengo mas contratiempos y lo posteo hoy. un saludo y grax ;)

PD:los enlaces son bastante buenos (el de recursosvisualbasic no lo conocia)


Título: Re: es posible...? (Consola)
Publicado por: WestOn en 20 Octubre 2008, 08:49 am
Wenas, estuve cambiando el motor del proyecto por esto:
Esto es para que cambie la variable a 1 (todas estan en 0 desde el principio) y la que este en 1 se abre:
Código
  1. Public Sub A1()
  2. Dim x As String, z
  3. Dim i As Integer
  4.  
  5. i = InStr(a, "clean")
  6. If i = 0 Then
  7. 'no ta
  8. Else
  9. E = 1 'la cambia si se encuentra clean
  10. End If
  11.  
  12. i = InStr(a, "jo")
  13. If i = 0 Then
  14.  
  15. Else
  16. F = 1
  17. End If
  18. End Sub

Hasta ahi todo perfecto(si se pone solo no funciona bien xDD) pero si dentro del if ponemos lo que puso cΔssiΔnі funciona mejor!! pero algo esta mal y solo detecta el comando solo (clean, jo) los modificadores no:
Código
  1. If E = 1 Then 'comando clean
  2. Dim sCacho()   As String
  3. Dim sResultado As String
  4. Trim$ (a) ' quita espacios al principio-final
  5. sCacho = Split(a, " ")
  6. sResultado = ""
  7. For i = 0 To UBound(sCacho)
  8. Select Case (LCase$(sCacho(i)))
  9. Case "clean": sResultado = sResultado & sCacho(i) & " "
  10. MsgBox "indicar parametro"
  11. Case "clean /q": sResultado = sResultado & sCacho(i) & " "
  12. MsgBox "clean /q"
  13. Case "clean /s": sResultado = sResultado & sCacho(i) & " "
  14. MsgBox "clean /S"
  15. End Select
  16. Next
  17. MsgBox sResultado
  18. End If
  19.  

haber si se me ha entendido..  :laugh: un saludo y grax de antemano


Título: Re: es posible...? (Consola)
Publicado por: Spider-Net en 20 Octubre 2008, 12:25 pm
De entrada, muchas gracias por NO hacerme caso con lo de indentar tu código  :¬¬, ya te lamentarás cuando programes códigos largos... en fin.

Estás muy perdido. Así en principio, deberías de leerte un manual de Visual Basic antes de intentar cosas más complicadas, porque te damos cosas hechas y que funcionan y te las cargas. xD

De entrada, no sé para que quieres esta parte del código:

Código
  1. Public Sub A1()
  2. Dim x As String, z
  3. Dim i As Integer
  4.  
  5. i = InStr(a, "clean")
  6. If i = 0 Then
  7. 'no ta
  8. Else
  9. E = 1 'la cambia si se encuentra clean
  10. End If
  11.  
  12. i = InStr(a, "jo")
  13. If i = 0 Then
  14.  
  15. Else
  16. F = 1
  17. End If
  18. End Sub

¿Para saber si está clean?. Eso ya lo hace tanto el código de cΔssiΔnі como el mío. Comprueban si existe el comando clean con if o con select case pero ambos lo comprueban, no necesitas ningún if antes.

Y esto ya...

Código
  1. If E = 1 Then 'comando clean
  2. Dim sCacho()   As String
  3. Dim sResultado As String
  4. Trim$ (a) ' quita espacios al principio-final
  5. sCacho = Split(a, " ")
  6. sResultado = ""
  7. For i = 0 To UBound(sCacho)
  8. Select Case (LCase$(sCacho(i)))
  9. Case "clean": sResultado = sResultado & sCacho(i) & " "
  10. MsgBox "indicar parametro"
  11. Case "clean /q": sResultado = sResultado & sCacho(i) & " "
  12. MsgBox "clean /q"
  13. Case "clean /s": sResultado = sResultado & sCacho(i) & " "
  14. MsgBox "clean /S"
  15. End Select
  16. Next
  17. MsgBox sResultado
  18. End If

¿Pero qué lío has hecho ahí?. ¿Un msgbox para cada resultado? Por qué modificas el código de cΔssiΔnі si funcionaba bien?

Código
  1. Private Sub Cmd_Click()
  2.    sCadena = Trim$(Text1.Text)
  3.    sCacho = Split(sCadena, " ")
  4.  
  5.    sResultado = ""
  6.  
  7.    For I = 0 To UBound(sCacho)
  8.        Select Case (LCase$(sCacho(I)))
  9.            Case "clean": sResultado = sResultado & sCacho(I) & " "
  10.            Case "/q": sResultado = sResultado & sCacho(I) & " "
  11.            Case "/s": sResultado = sResultado & sCacho(I) & " "
  12.        End Select
  13.    Next
  14.  
  15.    MsgBox sResultado
  16. End Sub

El Msgbox sResultado va sólo al final, no uno por cada case, el case lo que hace es ir añadiendo los parámetros si se los encuentra y sino no añade nada, no tienes que poner un msgbox por cada case. Eso sobra.

Case "clean": sResultado = sResultado & sCacho(i) & " "
MsgBox "indicar parametro"

Y eso tampoco tengo idea para que lo has puesto. Si ese case lo que hace es si encuentra la cadena clean la almacena en sResultado, sobra ahí msgbox, igual que todos los demás, un msgbox al final y listo.

Por último decirte que no pegues todo el código, queda mucho más claro tabulado y con saltos de línea para separar algunas cosas tal y como lo tenemos cΔssiΔnі y yo. Así como tú lo pones no sé si es que lo ves más claro, pero lo que haces es hacerlo más ilegible. Quitando todo lo que tú pones y dejando sólo y exclusivamente lo de cΔssiΔnі el código funciona perfectamente. Así que no lo modifiques mejor. Y sobre todo intenta leer y aprender a programar en Visual Basic antes de meterte en proyectos que te vienen grandes, es sólo un consejo.

Saludos!


Título: Re: es posible...? (Consola)
Publicado por: WestOn en 20 Octubre 2008, 14:40 pm
wenas, lo he tabulado un poco(lo tabulare mas el proximo ;)), me dejado alguna cosa porq pense que se entenderia, error mio :rolleyes:.La idea esta pues era porque con un code esta bien, pero ya cuando pongo mas de diez me parece un poco abultado y me lio yo solo con tanto code, de todas formas voy a usar lo de cΔssiΔnі y pondre todos los code dentro.
Lo de los mensajes lo puse por poner algo (en vez de poner consolewrite puse msgbox para que os fuera mas facil :P) y no me cargo el code jajaja pero no funciona cuando hago eso  :xD va es broma, venga un saludo y grax

PD:Lo modifique porq la variable era a, entonces sCadena sobraba no?(aver si toy metiendo la pata..) y luego lo de Trim$ a mas de lo mismo.
A bueno y lo de split tambien puse a.
enfin a sido una rayada mia xD


Título: Re: es posible...? (Consola)
Publicado por: WestOn en 21 Octubre 2008, 14:06 pm
Wenas, tengo un problema con la consola, os cuento:
Cuando estoy con la consola ejecutandose, si escribo mas de 9 caracteres en la misma linea y presiono enter, se salta 1 linea(por darle a enter) + otra linea(por superar 9 caracteres)...
Nose si se me ha entendido bien, en ese caso decirmelo y posteo alguna foto voy a seguir mirando aver si lo arreglo.

PD:Bueno ya que estoy con este post comento:
Ya una vez solucionado ese problema lo he aumentado para que acepte como maximo 1000 (pero en realidad son 999 xD), pues bueno tengo ya 999 caracteres para pegarlos y probarlo, pero jeje q sorpresa que no vale usar el Control+V para pegarlos, y escribirlos es muy pesado ajajaj :laugh:, ¿como puedo añadir en la consola la opcion de pegar y copiar?

un saludo ;)