¡Hola, chicos del scripting!Ten cuidado con lo que dices

Los chicos del scripting de Microsoft

DURANTE LA GUERRA CIVIL AMERICANA (concretamente, en la batalla de Spotsylvania), el general de la Unión John Sedgwick quedó consternado al ver a sus hombres retorcerse de miedo ante los disparos aleatorios de los francotiradores de los confederados. Según cuenta la leyenda, Sedgwick les dijo: "Me avergüenzo de vosotros, ¿cómo podéis esconderos así? Nunca darán en el blanco a esa distancia". Minutos después, Sedgwick se convirtió en el oficial de la Unión de mayor rango muerto durante la guerra. Puede que los Confederados no pudieran acertar a esa distancia, pero desafortunadamente para Sedgwick, el general resultó ser un blanco fácil.

Por supuesto, sobra decir que la moraleja de esta historia puede ser... (-Bueno, ahora que lo dices, "Si oyes disparos, agacha la cabeza", no queda mal, ¿no?). Increíble, pero no habíamos pensado en eso. En lugar de eso, habíamos llegado a la moraleja siguiente: "Cuidado con lo que dices, que un día esas palabras se pueden volver en tu contra". Así fue para el general John Sedgwick, y así puede ser para muchas otras personas. Por ejemplo, nadie recuerda a Thomas Watson, director de IBM durante bastante tiempo, como uno de los mayores emprendedores de la historia americana. En vez de eso, Watson ha pasado a la historia como el hombre que dijo, "Creo que el mercado mundial está preparado para cinco ordenadores tal vez".

Curiosamente, no existen pruebas de que Watson pronunciara realmente esas palabras; como mucho, puede que expresara a alguien su opinión sobre el tema. Sin embargo, eso no le interesa a nadie. Después de todo, la idea de que el director de IBM dijera que no existía mercado para los ordenadores es una historia tan jugosa, que deja a un lado el insignificante hecho de que puede no ser cierto, ¿verdad?

A propósito, Watson también dijo: "Si quieres tener éxito, multiplica la frecuencia de errores por dos". Este es precisamente el consejo que los chicos del scripting han adoptado como filosofía.

Bueno, por lo menos la parte de duplicar la frecuencia de errores.

Por otro lado, existe una cita que dice: "Si estás escribiendo scripts VBScript, no tendrás acceso a .NET Framework". Hay que reconocer que afirmar que los generadores de scripts no pueden tener acceso a Microsoft® .NET Framework es tan memorable como "Nunca darán en el blanco a esa distancia" o "Creo que el mercado mundial está preparado para cinco ordenadores tal vez". Sin embargo, dicha afirmación carece de fundamentos. Es cierto que .NET Framework ha sido diseñado con desarrolladores de C# y Visual Basic® como modelo; es igualmente cierto que VBScript no puede crear instancias de clases de .NET Framework nativas. Sin embargo, eso no significa que los generadores de scripts no tengan acceso a .NET Framework, por lo menos, no en todos los casos.

De acuerdo, tiene razón: no podemos negar que la mayoría de las clases de.NET Framework están fuera del alcance de VBScript. No obstante, existe un mayor número de clases de .NET que tienen contenedores tipo COM, lo que significa sencillamente que dichas clases incluyen una interfaz COM que ofrece posibilidades de acceso mediante un lenguaje de scripting como VBScript. Parece difícil de crear, ¿verdad? Échele un vistazo a la parte de HKEY_CLASSES_ROOT en el registro que se muestra en la figura 1; debe prestar atención a todos los tipos de clases que comiencen por System.

Figura 1 Clases System del registro

Figura 1** Clases System del registro **(Hacer clic en la imagen para ampliarla)

La mayoría son clases de .NET Framework y para la mayoría se puede crear una instancia mediante VBScript.

¡Se lo dije!

Por supuesto, como puede confirmar cualquier persona que haya comprado alguna vez un producto anunciado en televisión de madrugada, que se pueda hacer algo no significa que se deba hacer (suele existir un motivo para que dichos productos no se estén disponibles en comercios). Obviamente, puede crear una instancia de la clase System.ContextMarshalException en un script; simplemente no sabemos por qué o para qué la podría crear.

Sin embargo, este no es el caso de todas las clases de .NET Framework. Por ejemplo, uno de los mayores problemas en el campo del scripting es la dificultad para crear una lista de clasificación de los elementos. Para realizar una lista en orden alfabético, es necesario que use su propio conjunto de registros sin conexión o cree una función de clasificación, como los códigos de clasificación de burbuja siguientes (el párrafo siguiente puede herir la sensibilidad de los más débiles):

For i = (UBound(arrNames) - 1) to 0 Step -1
    For j= 0 to i
        If UCase(arrNames(j)) > 
          UCase(arrNames(j+1)) Then
            strHolder = arrNames(j+1)
            arrNames(j+1) = arrNames(j)
            arrNames(j) = strHolder
        End If
    Next
Next

No se asuste: hemos escrito el código y no estamos completamente seguros de lo que significa.

¿Cómo puede ayudarnos .NET Framework en una situación semejante? Para responder a esta pregunta, observemos un pequeño script sencillo y directo:

Set DataList = CreateObject _
      ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()

For Each strItem in DataList
    Wscript.Echo strItem
Next

Como puede comprobar, lo que hemos hecho aquí es crear una instancia de la clase de .NET Framework System.Collections.ArrayList. A continuación, hemos usado el método Add para agregar cinco elementos a la lista. Todo está bien y es correcto, salvo en un punto: agregamos estos elementos de una forma un tanto aleatoria (B, C, E, D, A), aunque necesitamos verlos por orden alfabético (A, B, C, D, E). Ha llegado el momento de usar el código de clasificación de burbuja, ¿no cree?

Error. Sentimos ser tan categóricos, pero es un error. Como se ha demostrado, no necesitamos usar el código de clasificación de burbuja; todo lo que necesitamos es llamar al método Sort de la lista de matrices:

DataList.Sort()

Eso es todo. Gracias a esa única línea de código podemos ordenar todos los elementos de nuestra lista de matrices.

¿Lo demostramos? ¡Que público más exigente! Está bien, espero que haya algún incrédulo. Esta es la razón por la que el script incluye un bucle For Each que se repite en todos los elementos de la lista, haciendo eco del valor de cada uno en la pantalla:

For Each strItem in DataList
    Wscript.Echo strItem
Next

Ahora le planteo una cuestión: ¿qué obtenemos cuando ejecutamos este script?

Exacto:

A
B
C
D
E

Está bien, ¿no?

Veamos, parece que el resultado no es del todo satisfactorio. Es correcto, pero lo que quería era devolver esos valores en orden descendente; es decir, desea obtener una lista de Z a A en lugar de una lista de A a Z. Si es posible. . .

Bueno, ningún problema. Sólo tenía que preguntar:

Set DataList = CreateObject _
      ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()
DataList.Reverse()

For Each strItem in DataList
    Wscript.Echo strItem
Next

Tiene razón: esto tiene el mismo mal aspecto que lo anterior, ¿verdad? Sin embargo, hemos realizado una adición importante. Observe la línea de código agregada, la línea posterior al método Sort:

DataList.Reverse()

¿Lo ve? Después de ordenar la lista en orden ascendente, llamamos al método Reverse que... sorpresa, sorpresa... invierte el orden de todos los elementos de la matriz. ¿Qué obtenemos? Un resultado con el aspecto siguiente:

E
D
C
B
A

Impresiona, ¿eh?

¡Pero espera! Puede ser todavía mejor. ¿Ha intentado alguna vez quitar un elemento de una matriz VBScript? No llore; no se lo voy a pedir. En lugar de eso, le vamos a demostrar lo fácil que es quitar un elemento de nuestra lista de matrices de .NET Framework. ¿No le gusta la letra D? Deshágase de ella. Aquí se muestra un script que crea una lista de matrices, la ordena y, a continuación, quita la entrada para la D:

Set DataList = CreateObject _
  ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()
DataList.Remove("D")

For Each strItem in DataList
    Wscript.Echo strItem
Next

Debe volver a mirar la pequeña línea de código posterior al método Sort:

DataList.Remove("D")

Hemos usado el método Remove para quitar el elemento igual a D. Este el resultado de ejecutar este script:

A
B
C
E

Hasta la vista, D!

No se olvide de la mejor parte: podemos quitar un elemento sin tener que cambiar el tamaño o dimensiones de la matriz. Ahora sí tiene buena pinta. No cabe duda de que también podemos agregar elementos a la matriz sin tener que cambiar el tamaño o dimensiones de sus componentes. Atrévase a decir que el scripting no es más fácil así.

Se lo crea o no se lo crea, sólo hemos descrito superficialmente lo que puede hacer con arraylist de .NET Framework (para obtener más información, consulte la entrada arraylist en .NET Framework SDK (en inglés)).

¿Es útil arraylist para los generadores de scripts? Digámoslo así: después de ver la utilidad de arraylist en .NET Framework, no estamos seguros de por qué quería usar una matriz VBScript integrada, al menos no para listas simples de elementos como las empleadas aquí.

Hay que reconocer que los chicos del Scripting no hemos analizado .NET Framework en profundidad para descubrir las clases que pueden servir a los generadores de scripts (y las que no). Estamos trabajando en ello. Mientras tanto, indague todo lo que desee en .NET Framework SDK (en inglés). Parece que siempre que examinamos SDK, encontramos algo nuevo e interesante que los generadores de scripts pueden aprovechar.

¿Cómo qué? Qué le parece la generación de números aleatorios. ¿Desea generar un número aleatorio entre 1 y 100 mediante el generador de números aleatorios de VBScript? No hay problema; sólo debe usar un código parecido a éste:

Randomize
Wscript.Echo Int((100 - 1 + 1) * Rnd + 1)

¿Se ha aprendido la fórmula? No se preocupe; resulta mucho más fácil e intuitivo usar la clase System.Random de .NET Framework:

Set objRandom = CreateObject("System.Random")
Wscript.Echo objRandom.Next_2(1,100)

Seguro que lo puede descifrar sin necesidad de explicaciones. En cualquier caso, se lo explicaremos brevemente, aunque sólo sea porque TechNet Magazine quiere que los columnistas escriban algo cada mes. No nos pregunté el motivo, es su política, no la nuestra.

Como puede ver, creamos una instancia de la clase System.Random y, a continuación, llamamos al método Next_2 e introducimos dos parámetros en el método:

  • 1, primer número del intervalo (recuerde que vamos a generar un número aleatorio entre 1 y 100).
  • 100, el valor superior del intervalo.

Eso es todo lo que debemos hacer.

Parece que tenemos tiempo para una última cuestión. Sí, el de la camiseta verde. ¿Quién dijo exactamente que los que escriben scripts no pueden obtener acceso a .NET Framework? Bueno, para ser totalmente sincero, al empezar, nosotros... -Vaya, parece que se ha acabado el tiempo. ¡Nos vemos el mes que viene!

¡Que disfruten!

Febrero está cerca, lo que sólo puede significar una cosa. No, el día de San Valentín, no. No, el Día del Presidente tampoco. Por amor de Dios, ¿el Día de la Marmota? No, cuanto más nos acercamos a febrero más cerca estamos de la edición de 2007 de Winter Scripting Games, la competición de scripting más importante del ámbito internacional (probablemente la única). La competición de este año promete ser más grande y mejor que nunca; esta vez habrá cuatro categorías:

  • Principiantes en VBScript
  • Expertos de VBScript
  • Principiantes en Windows PowerShell™
  • Expertos en Windows PowerShell

Visite la página principal de 2007 Winter Scripting Games (en inglés) para obtener más información.

¿Cómo que qué es eso? Está bien, gracias. Ah, que pase también un feliz Día de la Marmota.

Descargar Windows PowerShell hoy

Windows PowerShell 1.0 ya se puede descargar. ¡Y es gratuito! No deje pasar esta oportunidad, descargue el software y empiece a usarlo hoy.

Los chicos del scripting de Microsoft trabajan para (bueno, son empleados de) Microsoft. Cuando no juegan al béisbol, ni entrenan ni lo ven (u otras actividades varias), dirigen el TechNet Script Center. Visite la página web www.scriptingguys.com.

© 2008 Microsoft Corporation and CMP Media, LLC. Reservados todos los derechos; queda prohibida la reproducción parcial o total sin previa autorización.