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: 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:
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 (vb) [Seleccionar]
Dim A As String
Dim v As Variant

A = "Clean /e /r"
v = Split(A, " ")

'v(0) = Clean
'v(1) = /e
'v(2) = /r
'Ejemplo:
Dim i As Integer
For i = 0 To 2
   MsgBox v(i) & " es el parámetro " & i
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 (vb) [Seleccionar]
Option Explicit

Dim i As Integer
Dim s_Texto As String
Dim v_Argumentos As Variant

s_Texto = "Hola /a /b /c"
v_Argumentos = Split(s_Texto, " ")

For i = 0 To 2
    MsgBox "Argumento: " & v_Argumentos(i)
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 (vb) [Seleccionar]
If a = "clear" Then
v = Split(a, " ")
For i = 0 To 2
MsgBox "Argumento: " & v(i)
Next
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 (vb) [Seleccionar]
Option Explicit
Dim a As String
Private Sub Command1_Click()
InStr(a, "clear", vbTextCompare) 'Aqui salta el error
End Sub

Private Sub Form_Load()
a = "dgh ttdx tnh ck bd tbs xjthm cn clear rgtfc txvhtxv"
End Sub


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 (vb) [Seleccionar]
Option Explicit
Dim a As String

Private Sub Command1_Click()
MsgBox InStr(a, "clear")
End Sub

Private Sub Form_Load()
a = "dgh ttdx tnh ck bd tbs xjthm cn clear rgtfc txvhtxv"
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 (vb) [Seleccionar]
Option Explicit
Dim a As String
Dim i As Integer

Private Sub Command1_Click()
i = InStr(a, "clear")
If i = 0 Then
    MsgBox "no se encontro la palabra"
Else
    MsgBox "se encontro la palabra en la posicion " & i
End If
End Sub

Private Sub Form_Load()
a = "dgh ttdx tnh ck bd tbs xjthm cn clear rgtfc txvhtxv"
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 (vb) [Seleccionar]
Option Explicit
Dim a As String, z
Dim i As Integer
Private Sub Command1_Click()
a = Text1
z = 0
If z = 0 Then
i = InStr(a, "clean /s")
If i = 0 Then
'no ta
Else
i = InStr(a, "/q")
If i = 0 Then
MsgBox "Clean /S", vbInformation, "info"
Else
MsgBox "Clean /S /Q", vbInformation, "info"
End If
End If
End If
End Sub

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 (vb) [Seleccionar]

'Ejemplo de uso de Split para separar comandos
'Por Auron
'Espero que lo entiendas bien esta vez
Option Explicit
Dim a, resultado As String
Dim i, contador As Integer
Dim v As Variant

Private Sub Command1_Click()
a = Text1.Text 'Se almacena en a la cadena
v = Split(a, " ") 'Se separa cada parametro con un split

'v(0) = primer parametro
'v(1) = segundo parametro
'v(2) = tercer parametro... etc


'Se cuenta el numero de espacios que hay en el texto, así sabremos
'cuantos parámetros hay, porque entre cada parámetro ha de haber un espacio
For i = 1 To Len(a)
    If Mid(a, i, 1) = " " Then
        contador = contador + 1 'contador almacena el número de espacios
    End If
Next

'Si el primer parametro es el comando clean entramos
If LCase(v(0)) = "clean" Then
    resultado = "clean" 'asignamos el resultado clean
   
    'Si contador es mayor o igual que 1 es que hay uno o más parámetros
    If contador >= 1 Then
        If LCase(v(1)) = "/q" Then
            resultado = resultado & " /q" 'Si el parámetro 1 es /q se almacena en resultado
        ElseIf LCase(v(1)) = "/s" Then
            resultado = resultado & " /s" 'Si el parámetro 1 es /s se almacena en resultado
        End If
    End If
   
    'Si contador es mayor o igual que 2 es que hay dos o más parametros
    If contador >= 2 Then
        If LCase(v(2)) = "/q" Then
            resultado = resultado & " /q" 'Si el parámetro 2 es /q se almacena en resultado
        ElseIf LCase(v(2)) = "/s" Then
            resultado = resultado & " /s" 'Si el parámetro 2 es /s se almacena en resultado
        End If
    End If
   
    'Mostramos el resultado
    MsgBox "El comando resultante es: " & resultado, vbInformation, "Resultado"
End If
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
Cita de: 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

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 (vb) [Seleccionar]
Option Explicit
Dim sCadena    As String
Dim sCacho()   As String
Dim sResultado As String
Dim I          As Integer

Private Sub Cmd_Click()
    sCadena = Trim$(Text1.Text)
    sCacho = Split(sCadena, " ")

    sResultado = ""
   
    For I = 0 To UBound(sCacho)
        Select Case (LCase$(sCacho(I)))
            Case "clean": sResultado = sResultado & sCacho(I) & " "
            Case "/q": sResultado = sResultado & sCacho(I) & " "
            Case "/s": sResultado = sResultado & sCacho(I) & " "
        End Select
    Next
   
    MsgBox sResultado
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 (vb) [Seleccionar]
Public Sub A1()
Dim x As String, z
Dim i As Integer

i = InStr(a, "clean")
If i = 0 Then
'no ta
Else
E = 1 'la cambia si se encuentra clean
End If

i = InStr(a, "jo")
If i = 0 Then

Else
F = 1
End If
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 (vb) [Seleccionar]
If E = 1 Then 'comando clean
Dim sCacho()   As String
Dim sResultado As String
Trim$ (a) ' quita espacios al principio-final
sCacho = Split(a, " ")
sResultado = ""
For i = 0 To UBound(sCacho)
Select Case (LCase$(sCacho(i)))
Case "clean": sResultado = sResultado & sCacho(i) & " "
MsgBox "indicar parametro"
Case "clean /q": sResultado = sResultado & sCacho(i) & " "
MsgBox "clean /q"
Case "clean /s": sResultado = sResultado & sCacho(i) & " "
MsgBox "clean /S"
End Select
Next
MsgBox sResultado
End If


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 (vb) [Seleccionar]
Public Sub A1()
Dim x As String, z
Dim i As Integer

i = InStr(a, "clean")
If i = 0 Then
'no ta
Else
E = 1 'la cambia si se encuentra clean
End If

i = InStr(a, "jo")
If i = 0 Then

Else
F = 1
End If
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 (vb) [Seleccionar]
If E = 1 Then 'comando clean
Dim sCacho()   As String
Dim sResultado As String
Trim$ (a) ' quita espacios al principio-final
sCacho = Split(a, " ")
sResultado = ""
For i = 0 To UBound(sCacho)
Select Case (LCase$(sCacho(i)))
Case "clean": sResultado = sResultado & sCacho(i) & " "
MsgBox "indicar parametro"
Case "clean /q": sResultado = sResultado & sCacho(i) & " "
MsgBox "clean /q"
Case "clean /s": sResultado = sResultado & sCacho(i) & " "
MsgBox "clean /S"
End Select
Next
MsgBox sResultado
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 (vb) [Seleccionar]
Private Sub Cmd_Click()
    sCadena = Trim$(Text1.Text)
    sCacho = Split(sCadena, " ")

    sResultado = ""

    For I = 0 To UBound(sCacho)
        Select Case (LCase$(sCacho(I)))
            Case "clean": sResultado = sResultado & sCacho(I) & " "
            Case "/q": sResultado = sResultado & sCacho(I) & " "
            Case "/s": sResultado = sResultado & sCacho(I) & " "
        End Select
    Next

    MsgBox sResultado
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 ;)