¡Hola, chicos del scripting!

Bienvenido a la columna TechNet en la cual, por medio de Microsoft Scripting Guy, se abordan las preguntas frecuentes acerca de las secuencias de comandos para la administración de sistemas. ¿Tiene alguna pregunta sobre las secuencias de comandos para la administración de sistemas? Envíe un correo electrónico a scripter@microsoft.com. No podemos garantizarle que seremos capaces de responder todas las preguntas que nos lleguen, pero haremos todo lo posible.

Y no se olvide de consultar el Archivo de ¡Hola, chicos del scripting!.

Pregunta del día: ¿cómo puedo agregar un comando de edición al menú contextual de una HTA?


¿Cómo puedo agregar un comando de edición al menú contextual de una HTA?

P

¡Hola, chicos del scripting! ¿Cómo puedo agregar un comando de edición al menú contextual de una HTA? De esa forma, cada vez que haga clic con el botón secundario del mouse (ratón) en un archivo HTA, podría elegir dicho comando y abrir el archivo en Bloc de notas.

-- TC

R

Hola TC. Uno de los chicos del scripting tenía un amigo que consiguió un trabajo de verano haciendo tartas en una panadería local. Cierto es que parece el trabajo ideal, y lo era, salvo por una cosa: este amigo nunca llegó a probar las tartas, porque se vendían enteras y no podía cortarse un pedazo de vez en cuando. Al final, resultó ser el peor trabajo del mundo: siempre rodeado por el aroma de las tartas recién horneadas y sin poder probar ni un bocado.

Los chicos del scripting nos sentimos identificados con este pobre amigo pastelero. Al fin y al cabo, cada día escribimos nuevas secuencias de comandos que casi nunca utilizamos nosotros mismos. Hemos escrito secuencias para la administración de Active Directory pero, por algún extraño motivo, no nos está permitido administrar Microsoft Active Directory. (Vaya uno a saber por qué.) Hemos escrito secuencias de comandos para la administración de servidores DNS, pero no podemos crear nuestros propios servidores DNS. Hemos escrito secuencias para la creación de gráficos en Excel, pero no se nos permite crear gráficos en Excel.

Bueno, sí, eso nos está permitido; pero no tenemos nada para lo que merezca la pena crear gráficos.

Pero esta tarea es diferente. Utilizamos HTA continuamente; siempre hacemos clic con el botón secundario del mouse en una HTA y elegimos el comando Edit (Editar) para abrir la HTA en Microsoft Word (o Microsoft FrontPage, según qué programa esté instalado en ese equipo determinado), que, por cierto, no es nuestro editor preferido para las HTA. Como en su caso, preferiríamos utilizar Bloc de notas, que nos permitiría beneficiarnos de una secuencia de comandos que agregaría un comando Edit a los archivos HTA. Se trataría de una secuencia similar a la siguiente:

Const HKEY_CLASSES_ROOT = &H80000000
strComputer = "."
 
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "htafile\Shell\Edit\Command"
objRegistry.CreateKey HKEY_CLASSES_ROOT,strKeyPath
strValue = "%SystemRoot%\system32\NOTEPAD.EXE %1"
objRegistry.SetExpandedStringValue HKEY_CLASSES_ROOT,strKeyPath,vbNullString,strValue

Si desea agregar un comando al menú contextual de un archivo HTA (como obviamente es el caso), primero debe agregar una nueva clave al Registro; en concreto, debe ir a HKEY_CLASSES_ROOT y agregar la clave htafile\Shell\Edit\Command. Eso es lo que hacemos en la primera mitad de la secuencia. Definimos una constante llamada HKEY_CLASSES_ROOT y establecemos el valor como &H80000000, que indica a la secuencia de comandos con qué subárbol del Registro debe trabajar. A continuación, conectamos con el servicio WMI en el equipo local (aunque esta secuencia también se puede ejecutar en equipos remotos) y enlazamos con la clase StdRegProv del espacio de nombres root\default.

Hasta aquí muy sencillo, ¿verdad? Posteriormente empleamos esta línea de código para asignar la ruta (dentro de HKEY_CLASSES_ROOT) a la nueva clave del Registro a una variable denominada strKeyPath:

strKeyPath = "htafile\Shell\Edit\Command"

Una vez hecho eso, podemos utilizar el método CreateKey para crear nuestra nueva clave. Para ello sólo debemos llamar a CreateKey y pasarle dos variables: la constante HKEY_CLASSES_ROOT y la variable strKeyPath. O, para ser más precisos:

objRegistry.CreateKey HKEY_CLASSES_ROOT,strKeyPath

¿Cómo dice? ¿Que qué ocurre si ya tiene una clave del Registro denominada htafile\Shell\Edit\Command? Bueno, ningún problema. Si ya existe esa clave no ocurre nada malo; la secuencia de comandos simplemente omitirá el método CreateKey y se desplazará a la siguiente línea del código. No se producirá ningún error si ya existe esa clave del Registro.

Y sí, es bonito, ¿verdad?

Ahora debemos asignar el comando que se va a llevar a cabo (es decir, “Abrir este archivo con Bloc de notas”) al valor predeterminado de la clave Command. No resulta especialmente difícil, pero que puede ser un poco delicado. Así que quizá deberíamos explicar su funcionamiento.

Como sabe, queremos que los archivos HTA tengan un menú contextual similar al de los archivos de VBScript: queremos poder hacer clic con el botón secundario del mouse en un archivo HTA, seleccionar Edit y hacer que la HTA se abra en Bloc de notas. Para ser sinceros, no estábamos seguros al 100% de cómo hacerlo, así que echamos un vistazo al valor predeterminado para la clave VBSFile\Shell\Edit\Command. Es similar a esto:

%SystemRoot%\system32\NOTEPAD.EXE %1

¿Funcionará también para los archivos HTA? Bien, si no se intenta no se puede saber, ¿verdad? Con esa idea en mente, asignamos la misma cadena a una variable denominada strValue:

strValue = "%SystemRoot%\system32\NOTEPAD.EXE %1"

Ahora sólo necesitamos asignar el valor de esta variable al valor predeterminado de htafile\Shell\Edit\Command. Antes de proceder, debemos tener en cuenta dos cosas. Primero, puede que haya observado que la variable de entorno %SystemRoot% está incrustada en nuestro comando. Eso está bien: significa que podemos incluir la ruta a Bloc de notas sin necesidad de saber si el directorio de Windows es C:\Windows o D:\Winnt o cualquier otro. Sin embargo, también implica que debemos configurar el valor predeterminado con un tipo de datos REG_EXPAND_SZ. Un valor del Registro con este tipo de datos “expandirá” automáticamente una variable de entorno con la ruta física real; en otras palabras, cambiará %SystemRoot%\system32\NOTEPAD.EXE por algo similar a C:\Windows\system32\NOTEPAD.EXE.

¿Resultará complicado asignar al valor predeterminado un tipo de datos REG_EXPAND_SZ? Vamos: si fuera tan complicado, ¿de verdad cree que los chicos del scripting lo iban a intentar? Lo único que debemos hacer es asegurarnos de que, cuando asignamos el valor, utilizamos el método SetExpandedStringValue.

Buena observación. Algunos se habrán preguntado por qué seguimos utilizando la frase genérica “valor predeterminado” en lugar de mencionar el nombre del valor del Registro que debemos modificar. En realidad hay una buena razón para ello: el valor predeterminado para una clave del Registro no tiene un nombre. (Aparece como (Default) en RegEdit, pero se trata únicamente de un valor de marcador de posición y no del nombre.) Así pues, ¿cómo podemos tener acceso a un valor del Registro que no tiene nombre? Por suerte esto también resulta muy sencillo: simplemente no especificamos un nombre cuando llamamos al método SetExpandedStringValue. Examine la línea de código en la que llamamos a SetExpandedStringValue:

objRegistry.SetExpandedStringValue HKEY_CLASSES_ROOT,strKeyPath,vbNullString,strValue

Observe los cuatro parámetros: la constante HKEY_CLASSES_ROOT, la variable strKeyPath, la constante de VBScript vbNullString y la variable strValue. El secreto para trabajar con el valor predeterminado para una clave del Registro consiste en utilizar vbNullString (que simplemente representa un valor nulo) en lugar de un nombre de valor. Cuando se especifica vbNullString en lugar del nombre de valor, se conectará automáticamente con el valor predeterminado.

¿Verdad que WMI es maravilloso?

Por supuesto que WMI es estupendo, pero no tenemos tiempo para charlar ahora. Por algún motivo nos apetece un buen trozo de tarta de moras.

Que sean dos buenos trozos de tarta de moras. Y quizá un poco de tarta de crema de chocolate de postre.


Para más Información

Consulte el Archivo de ¡Hola, chicos del scripting!.

Arriba Arriba