Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
por Saad Ladki
Introducción
Windows PowerShell es el lenguaje de scripting y shell de Microsoft. En este breve artículo se ofrece un breve recorrido por Windows PowerShell e IIS. Al leer este artículo, obtendrá un conocimiento sólido de lo que es Windows PowerShell, obtendrá información sobre la relación entre Windows PowerShell e IIS y descubrirá algunas de las formas en que Windows PowerShell realiza tareas de administración de IIS.
La información que se presenta aquí es útil para los administradores de TI, desarrolladores de software, evaluadores de software y administradores. Incluso los más escépticos se convencerán de que Windows PowerShell es una herramienta imprescindible.
Acerca de Windows PowerShell
Windows PowerShell es el entorno completo del shell de próxima generación de Microsoft y el lenguaje de scripting. Considere Windows PowerShell como una actualización espectacular del antiguo shell de comandos cmd.exe y de los archivos .BAT. Los usuarios pueden preguntar por qué hay un nuevo shell de comandos, cuando Cmd.exe funciona bien, y no hay tiempo para aprender otro lenguaje de scripting. Windows PowerShell es una mejora con respecto a las tecnologías anteriores de scripting de línea de comandos de Microsoft, lo que significa que Windows PowerShell es más fácil de usar para tareas sencillas y complejas, y es sorprendentemente fácil de aprender.
Algunas de las mejoras de Windows PowerShell incluyen:
- Un lenguaje de scripting actualizado y coherente
- Funcionalidades intrínsecas de expresiones regulares
- La capacidad de llamar al .NET Framework, a las extensiones WMI y al registro de Windows
En esta sección se proporcionan ejemplos concretos y se resaltan algunas de las características de Windows PowerShell. En las secciones siguientes, se describe cómo funciona Windows PowerShell junto con IIS.
Para obtener una sensación para Windows PowerShell, vea un ejemplo. Considere la captura de pantalla en la figura 1.
Figura 1: Conceptos básicos de Windows PowerShell
En primer lugar, observe que el shell de Windows PowerShell es similar a un símbolo del sistema tradicional de Windows. El uso de Windows PowerShell le resultará muy natural tras un breve periodo de adaptación.
El primer comando es:
PS C:\> set-location Data
Esto invoca un cmdlet de Windows PowerShell (pronunciado "command-let") para cambiar el directorio de trabajo actual de C:\
a C:\Data
. Este es el equivalente funcional del comando cd antiguo (cambiar directorio). Puede que note que tener que teclear "set-location" cada vez que cambia el directorio actual es teclear demasiado; esto es correcto.
Windows PowerShell tiene un amplio conjunto de alias de acceso directo que puede usar. El cmdlet set-location tiene como alias sl (una versión abreviada del nombre completo del cmdlet), y cd (la forma "antigua"). En este artículo se usa la versión completa de los nombres de cmdlet para mejorar la legibilidad.
El segundo comando es:
PS C:\Data> get-childitem Pow*
Esto enumera el contenido del directorio actual que comienza con "Pow". Windows PowerShell no distingue mayúsculas de minúsculas, por lo que puede escribir Get-ChildItem o GET-ChildItem. En este artículo se utilizan todas las minúsculas. El cmdlet get-childitem tiene los alias dir (para familiarizarse con Windows) y ls (para usuarios de Unix), y el alias gci para facilitar la escritura.
A continuación, use el cmdlet copy-item para copiar el directorio de Windows PowerShell, incluidos todos los subdirectorios, en un nuevo directorio denominado PSBackup:
PS C:\Data> copy-item 'PowerShell' 'C:\Data\PSBackup' -recurse –force
A continuación, elimine inmediatamente el directorio recién creado y todo su contenido mediante el cmdlet remove-item:
PS C:\Data> remove-item PSBackup –recurse
El siguiente comando usa el cmdlet get-content para capturar el contenido del archivo Hello.txt y, a continuación, guardar ese contenido en un nuevo archivo de HelloCopy.txt en el directorio actual canalizando (con el carácter "|") al cmdlet out-file:
PS C:\Data> get-content 'Hello.txt' | out-file '.\HelloCopy.txt'
El siguiente comando usa get-content para mostrar el contenido del nuevo archivo:
PS C:\Data> get-content HelloCopy.txt
El cmdlet get-content es aproximadamente equivalente a los comandos de tipo (Windows) o cat (Unix). Finalice la mini-demo mediante el alias sl para cambiar el directorio de trabajo a la unidad raíz:
PS C:\Data> sl \
Ahora bien, si todo lo que conllevara Windows PowerShell fuera realizar tareas comunes de navegación y manipulación del sistema de archivos mediante un nuevo conjunto de comandos, no tendría sentido seguir leyendo. Una introducción breve, de un párrafo, podría llevar a esa suposición incorrecta. Sin embargo, Windows PowerShell tiene muchas ventajas sobre muchos entornos de shell actuales.
Para concluir esta explicación introductoria de Windows PowerShell: Windows PowerShell tiene una curva de aprendizaje. La nueva tecnología es inútil a menos que exista una forma de aprenderla rápidamente. Los programadores llaman a esto detectabilidad del proceso. Windows PowerShell se diseñó con excelentes características de detectabilidad, lo que facilita mucho el aprendizaje.
Por ejemplo, puede obtener una lista de todos los cmdlets simplemente escribiendo get-command en el indicador de Windows PowerShell. También puede obtener información detallada sobre un cmdlet concreto escribiendo get-help seguido del nombre del cmdlet. La amplia experiencia en la enseñanza de Windows PowerShell a ingenieros y directivos demuestra que la mayoría de los ingenieros pueden convertirse en expertos en el uso de Windows PowerShell con un solo día de práctica.
Windows PowerShell en un entorno típico de IIS
En la sección anterior de este artículo se proporciona información general breve y básica de Windows PowerShell. Sin embargo, una ventaja real del uso de Windows PowerShell procede de la capacidad de Windows PowerShell para interactuar con IIS y administrarlo. Es posible que los ingenieros que lean este artículo se muestren escépticos ante las afirmaciones de "lo último y lo mejor". Este artículo mostrará brevemente el poder que hay detrás de Windows PowerShell: muchas tareas de administración de IIS pueden realizarse utilizando comandos y scripts de Windows PowerShell, así como las herramientas de la GUI de IIS.
Con IIS, ahora tiene la posibilidad de realizar muchas tareas de administración utilizando cualquiera de las siguientes:
- Interfaz gráfica de usuario (GUI)
- Comandos interactivos de Windows PowerShell
- Scripts de Windows PowerShell
Aquellos usuarios con una experiencia significativa en la administración de software de servidor mediante shells y scripts no necesitan más motivación; pero aquellos acostumbrados a utilizar herramientas estrictamente GUI pueden preguntarse qué tiene de especial poder administrar IIS mediante una línea de comandos o un script, cuando ya se han desenvuelto suficientemente bien con MMC. Al final de este artículo se señalan seis ventajas significativas de la administración de IIS mediante Windows PowerShell.
A continuación se presentan algunos ejemplos de Windows PowerShell basados en un Webcast en el que participaron el arquitecto de Windows PowerShell Jeffrey Snover y el director de la unidad de productos IIS Bill Staples.
Supongamos que desea examinar los servicios relacionados con IIS que se ejecutan en su ordenador, una tarea muy común. Un "enfoque GUI" para hacer esto es lanzar MMC y luego expandir la categoría Servicios y Aplicaciones, y luego seleccionar la categoría Servicios. El resultado se parece a la captura de pantalla de la figura 2.
Figura 2: Uso de MMC para obtener información de servicio
Enumerar los servicios de Windows utilizando Windows PowerShell es fácil. Por ejemplo, desde el indicador de Windows PowerShell, utilice el cmdlet get-service:
PS C:\> get-service
Esto no es muy convincente, pero suponga que desea enumerar solo los servicios que empiezan por la letra "w" y ordenarlos por estado. Una forma de hacerlo es:
PS C:\> get-service -include w* | sort-object -property status
Puede interpretar este comando como que busca toda la información de los servicios de Windows pero luego filtra para incluir solo aquellos servicios que tengan un nombre que empiece por la letra 'W'; después, ordena esos resultados según el estado del servicio (en ejecución, detenido, en pausa). El resultado se parece a la captura de pantalla de la figura 3.
Figura 3: Uso de Windows PowerShell para obtener información de servicio
Como se ha señalado en la sección anterior, puede escribir comandos PowerShell concisos; el comando anterior puede abreviarse como:
PS C:\> gsv w* | sort status
Aquí se utiliza gsv, que es un alias de get-service; aprovecha que el modificador -include está en la primera posición del parámetro, utilizando sort, que es un alias del cmdlet sort-object. El modificador -property está en la primera posición del parámetro. Ahora supongamos que desea detener el servicio World Wide Web Publishing. Sin PowerShell, puede hacer clic con el botón derecho en el servicio W3SVC para obtener su menú contextual y hacer clic en el elemento Detener. Con Windows PowerShell puede emitir el comando:
PS C:\> stop-service -servicename w3svc
o bien, en forma abreviada:
PS C:\> spsv w3svc
Otra tarea común es examinar los procesos que se ejecutan en una máquina. En este punto, puede predecir cómo hacer esto utilizando Windows PowerShell: el esquema de nomenclatura de cmdlets coherente y lógico de Windows PowerShell hace que adivinar los comandos sea fácil en lugar de frustrante:
PS C:\> get-process
Supongamos que desea ver los procesos en ejecución ordenados por el número de identificadores que posee cada proceso:
PS C:\> get-process | sort-object -property handles
Puede obtener esta información con facilidad mediante el Administrador de tareas de Windows basado en GUI. Pero tenga en cuenta lo que hacen estos tres comandos de Windows PowerShell:
PS C:\> $p = get-process
PS C:\> $result = $p | measure-object -property handles -sum -average -max
PS C:\> $result | out-file '.\ProcessHandleStats.txt'
El primer comando, $p = get-process, obtiene toda la información sobre los procesos que se están ejecutando actualmente en la máquina anfitriona, y almacena esa información en la variable $p.
El segundo comando, $result = $p | measure-object -property handles -sum -max, envía la información del proceso capturado al cmdlet measure-object, que calcula la suma, la media y el valor máximo de todos los identificadores en uso por los procesos que se están ejecutando en ese momento, y almacena esa información en la variable $result. Si ha examinado $result en este momento, verá algo parecido a:
Recuento : 54
Media: 273.148148148148
Suma: 14750
Máximo: 1625
Mínimo:
Propiedad: identificadores
Observe que en este ejemplo hay un total de 54 procesos en ejecución y un total de 14.750 identificadores en uso, lo que supone una media de unos 273 identificadores por proceso. El mayor número de identificadores utilizados por un proceso es de 1625 identificadores.
Tercera línea, $results | out-file '.\ProcessHandleStats.txt', guarda los resultados en un archivo de texto. Es probable que los usuarios de Windows PowerShell experimentados combinen los tres comandos descritos en un solo comando, como:
PS C:\> gps | measure-object handles -sum -average -max |
out-file '.\ProcessHandleStats.txt'
Una característica de la arquitectura de Windows PowerShell es que Windows PowerShell es fácilmente extensible en todos los niveles tanto por usuarios como por empresas de terceros. La extensibilidad de Windows PowerShell es un tema de su propio derecho y este es un ejemplo.
En la demostración de conversión web a la que se hace referencia al final de este artículo, Jeffrey Snover y Bill Staples muestran un notable cmdlet de salida de visualización de Windows PowerShell desarrollado por una empresa de terceros. Este cmdlet se denomina medidor de salida. Observe la similitud semántica con el cmdlet intrínseco out-file. En lugar de enviar la salida a un archivo como hace el out-file, el medidor de salida envía la salida a un conjunto visualmente enriquecido de controles. Por ejemplo, uno de los comandos que se muestran en la conversión web es:
PS C:\> get-process |
measure-object handles -sum |
out-gauge -value sum -refresh 0:0:1 -float -type
Este comando genera un medidor de estilo digital flotante en pantalla que muestra el número total de identificadores en uso en tiempo real y actualiza la pantalla cada segundo. Todo esto demuestra que pronto estará disponible una amplia gama de herramientas útiles basadas en Windows PowerShell.
A continuación, examine un ejemplo de implementación de sitio web de IIS mediante Windows PowerShell. Dado que las versiones anteriores de la configuración del almacén de IIS en la metabase, no es posible copiar un sitio web de una máquina a otra. IIS hace que la implementación del sitio web sea una cuestión sencilla de copiar archivos. Tenga en cuenta este script de Windows PowerShell:
# file: Deploy-Application.ps1
$sourceMachine = "DemoServer1"
$farmList = get-content '.\RestOfFarm.txt'
$filesToCopy = get-content '.\AppManifest.txt'
foreach ($targetMachine in $farmList)
{
foreach ($file in $filesToCopy)
{
$sourcePath = "\\" + (join-path $sourceMachine $file)
$destPath = "\\" + (join-path $targetMachine $file)
write-host -for yellow "$targetMachine : Copying files from
$sourcePath"
copy-item $sourcePath $destPath
-recurse -force
}
}
Este script es complejo pero instructivo. Cuando se guarda como archivo Deploy-Application.ps1 y, a continuación, se ejecuta desde una línea de comandos de Windows PowerShell, tiene este aspecto:
PS C:\> .\Deploy-Application.ps1
El efecto neto es copiar todos los archivos enumerados en el archivo AppManifest.txt, ubicado en la máquina DemoServer1, en todas las máquinas enumeradas en el archivo RestOfFarm.txt. Una característica de Windows PowerShell es que los scripts bien escritos son fáciles de entender, en relación con las alternativas, como VBScript o Perl. El script usa el cmdlet get-content para leer nombres de máquina de RestOfFarm.txt de archivo y nombres de archivo de AppManifest.txt de archivo.
El bucle foreach puede ser nuevo para usted. El bucle externo recorre en iteración cada nombre de máquina almacenado en la variable $farmList, almacenando cada nombre en la variable $targetMachine a su vez. El bucle interno es similar y almacena cada archivo en $file a su vez. El cmdlet join-path se usa para concatenar cadenas de forma inteligente para generar rutas de acceso de origen y destino completas.
Por último, el cmdlet copy-item realiza las acciones de copia, donde el modificador -recurse copia todos los subdirectorios y el modificador -force hace que se sobrescriban los archivos existentes. Tenga en cuenta que este script tiene toda la información sobre las ubicaciones de origen y destino codificadas de forma rígida en él. Windows PowerShell tiene excelentes funcionalidades de paso de parámetros, por lo que este script de ejemplo se podría parametrizar para aceptar información de la línea de comandos; sin embargo, ese tema está fuera del ámbito de este artículo.
Windows PowerShell con IIS
Hasta ahora, este artículo ha presentado ejemplos de Windows PowerShell que se aplican a cualquier máquina servidor. Ahora examinamos algunos cmdlets de Windows PowerShell específicos de IIS.
IIS agrega la eficaz capacidad de almacenar en caché contenido creado dinámicamente. IIS ha tenido mucho tiempo la capacidad de almacenar en caché páginas estáticas. Cuando el servidor recibe nuevas solicitudes de cliente para contenido solicitado recientemente, se produce lo siguiente: en lugar de tener que recuperar ese contenido del almacenamiento externo, el contenido solicitado se puede extraer inmediatamente de la memoria caché y devolverlo al cliente. El resultado es una gran mejora del rendimiento. IIS amplía esta idea habilitando también el almacenamiento en caché de páginas creadas dinámicamente. Considere esta versión preliminar, cmdlet de Windows PowerShell de IIS:
PS C:\> add-iiscaching
-computer $computerlist
-path Demo
-location index.php
-credential $cred
-extension .php
-kernelcachepolicy 0
-itemlocation 0
-policy 1
-varybyquerystring "Qwd,Qif,Qiv,Qis"
Escribir cmdlets personalizados es un tema fuera del ámbito de este artículo, pero en este ejemplo se proporciona una idea de los tipos de cmdlets que puede escribir y qué comunidad de IIS escribirá. El nombre del cmdlet es add-iiscaching. Como se mencionó anteriormente, Windows PowerShell tiene una arquitectura extensible que permite al equipo de desarrollo de IIS crear cmdlets personalizados que funcionan directamente con IIS. El efecto neto de este comando es habilitar el almacenamiento en caché dinámico para las solicitudes de página con Qwd, Qif, Qiv y Qis en la cadena de consulta en una aplicación PHP determinada en todos los servidores IIS cuyos nombres se almacenan en la variable $computerlist.
Aunque el punto principal debe estar claro, que IIS puede habilitar fácilmente una eficaz mejora del rendimiento mediante un comando sencillo de Windows PowerShell, el artículo continúa con los detalles de los parámetros del modificador en este ejemplo.
El primer argumento, -computer $computerlist, especifica en qué máquinas se va a realizar el comando add-iiscaching. Por ejemplo, si tenía un archivo de texto simple denominado "MyServers.txt" con nombres de máquina como:
demo1server
demo2server
demo3server
demo4server
a continuación, el comando
PS C:\> $computerlist = get-content '.\MyServers.txt'
lee la lista de servidores en la variable $computerlist.
El segundo argumento, -path Demo, apunta a la ruta de acceso raíz de la aplicación en la que desea habilitar el almacenamiento en caché. En este ejemplo, dado que el valor de la ruta de acceso no tiene espacios, es posible omitir los caracteres de comillas, aunque podrían haberse usado de esta manera: -path "Demo".
El tercer argumento, -location index.php, apunta a la aplicación de destino. El cuarto argumento, -credential $cred, contiene información de autenticación en la variable $cred. Esto es necesario porque copiaremos archivos en máquinas remotas. Este cmdlet intrínseco de get-credential también puede capturar esta información, como:
PS C:\> $cred = get-credential
Este comando inicia un control GUI en el que el usuario podría especificar un nombre de usuario y una contraseña, y los resultados se almacenarían en la variable $cred.
El quinto argumento, -extension .php, especifica el tipo de aplicación que se va a almacenar en caché.
El sexto argumento, -kernelcachepolicy 0, indica al cmdlet add-iiscaching que no almacene en caché la información del kernel.
El séptimo argumento, -itemlocation 0, especifica dónde almacenar en caché la información de respuesta; 0 significa almacenar en el cliente o en el servidor.
El octavo argumento, -policy 1, significa continuar el almacenamiento en caché hasta que haya un cambio en el elemento de caché subyacente (en lugar de almacenar en caché durante un intervalo de tiempo especificado).
El argumento final, -varybyquerystring "Qwd,Qif,Qiv,Qis", indica a IIS qué tipo de respuesta a la caché, en este caso, las respuestas a las solicitudes que contienen Qwd, Qif, Qiv y Qis en la cadena de consulta. (Estos son elementos de nombre específicos de pares nombre-valor usados por la aplicación PHP en este ejemplo).
Resumen
En este artículo se presentó un vistazo rápido a Windows PowerShell, el nuevo entorno de shell y el lenguaje de scripting de Microsoft. Mostró algunos ejemplos típicos de navegación y manipulación de archivos de Windows PowerShell y hizo la notificación de que Windows PowerShell va mucho más allá de los entornos de shell existentes.
En la segunda sección de este artículo se muestra cómo usar Windows PowerShell en un entorno típico en el que IIS se está ejecutando. En los ejemplos se incluyen el examen de los servicios y procesos de Windows en un equipo host. También prometió una lista de algunas de las ventajas de usar Windows PowerShell para administrar e interactuar con IIS.
Estos son seis comentarios sobre estas ventajas de los primeros usuarios de Windows PowerShell. También incluyen ventajas que el equipo de IIS ha experimentado.
- Dado que los comandos de Windows PowerShell se pueden almacenar como scripts, se pueden guardar y ejecutar desatendidos. Esta ventaja es válida para cualquier técnica basada en secuencias de comandos, pero Windows PowerShell es significativamente más fácil de utilizar que otros lenguajes de scripting existentes.
- Dado que los comandos de Windows PowerShell se pueden almacenar y usar como scripts, crean un registro autodocumentado de la actividad de administración de IIS. ¿Con qué frecuencia ha intentado recordar cómo modificó alguna clave del Registro mediante la GUI de regedit.exe?
- En comparación con el uso de interfaces de administración basadas en GUI, los comandos de Windows PowerShell "quitar la magia" y permiten ver exactamente lo que está ocurriendo. Las herramientas basadas en GUI son buenas para una actividad de administración más ligera. Sin embargo, el uso de herramientas basadas en GUI puede provocar pensamientos como: "No estoy seguro de por qué funciona exactamente, pero cuando hago doble clic en esto, normalmente corrige el problema".
- Dado que muchos otros productos de servidor de Microsoft se basarán en Windows PowerShell, cada vez que use comandos y scripts de Windows PowerShell para administrar IIS, obtendrá aprendizaje indirectamente en otros sistemas.
- El uso de Windows PowerShell crea un paradigma de administración común y medios de comunicación: las comunidades de Windows PowerShell están creciendo rápidamente y es mucho más fácil comprender la documentación o las entradas de blog que están en forma de comandos de Windows PowerShell que para comprender la documentación que lee, "Abrir MMC y, a continuación, hacer clic aquí y hacer doble clic allí. . ."
- Dado que Windows PowerShell es un entorno completo, puede realizar la mayoría del trabajo en Windows PowerShell. No es necesario saltar constantemente de un programa basado en GUI, a un shell de cmd.exe, a otro programa basado en GUI. Esto es similar a la forma en que las actividades de desarrollo de software han evolucionado de usar compiladores independientes, enlazadores, depuradores, etc., para usar un entorno integrado como Visual Studio.
La segunda sección de este documento también mostró un ejemplo de un script de Windows PowerShell que muestra la capacidad de IIS para implementar servidores web en varias máquinas mediante operaciones sencillas de copia de archivos.
En la tercera sección de este documento se explica cómo el diseño de Windows PowerShell permite a la comunidad de IIS crear y compartir cmdlets personalizados de Windows PowerShell que funcionan directamente con la funcionalidad nativa de IIS. En concreto, presentó add-iiscaching, un cmdlet de versión preliminar que puede habilitar la capacidad de IIS para almacenar en caché páginas creadas dinámicamente.
Aunque este artículo solo ha tratado de forma superficial el funcionamiento conjunto de Windows PowerShell e IIS, debería haberle convencido de que los dos en conjunto proporcionan una experiencia de administración de TI más fácil, eficiente y agradable.
Recursos de Windows PowerShell e IIS
Search Channel 9 se ha unido a Microsoft Learn para la conversión web con el arquitecto de Windows PowerShell Jeffrey Snover y Bill Staples del Administrador de unidades de producto de IIS, que sirve como base para el artículo.
Consulte aquí para obtener más información sobre las herramientas de visualización basadas en Windows PowerShell.
Consulte www.iis.net para obtener información sobre Microsoft IIS.
Acerca del autor
Dr. James McCaffrey trabaja para Volt Information Sciences, Inc., donde administra la formación técnica para ingenieros de software que trabajan en el campus de Microsoft Redmond, Washington. Ha trabajado como ingeniero principal en varios productos clave de Microsoft, como Internet Explorer y MSN Search, y es el autor de ".NET Test Automation: A Problem-Solution Approach", Apress, 2006.