18Aug

Geek School: Aprendiendo a usar objetos en PowerShell

click fraud protection

Comprender los objetos es uno de los conceptos fundamentales para "obtener" PowerShell.Únase a nosotros a medida que exploramos los objetos y cómo hacen que PowerShell sea mejor que cualquier otro tipo de shell que hay hoy en día.

Asegúrese de leer los artículos anteriores de la serie:

  • Aprenda a automatizar Windows con PowerShell
  • Aprenda a usar los cmdlets en PowerShell

Y esté atento al resto de la serie durante toda la semana.

Objects

¿Alguna vez se ha preguntado qué diferencia a PowerShell de un shell Linux tradicional como Bash, o incluso el símbolo del sistema heredado? La respuesta es realmente simple: texto de salida tradicional de shells, lo que hace que sea difícil hacer cosas como formatear y filtrar. Por supuesto, hay herramientas para ayudarlo a hacer el trabajo( le vienen a la mente sed y grep), pero al final del día, si desea hacer algún tipo de análisis de texto pesado, necesita conocer expresiones regulares como elDetrás de tu mano.

PowerShell aprovecha el marco. Net subyacente y adopta un enfoque diferente, utilizando objetos en lugar de texto. Los objetos son solo una representación de algo. Son una colección de partes y acciones para usarlas. Echemos un vistazo a las partes de una bicicleta y cómo podemos usarlas.

instagram viewer

Los objetos en. Net son muy parecidos, excepto por dos pequeñas diferencias: las "Partes" se denominan , las propiedades y las "Instrucciones" se llaman , métodos .Si quisiéramos representar un Servicio de Windows como un objeto, podríamos decidir que es apropiado describirlo usando tres propiedades: Nombre del servicio, Estado y Descripción. También necesitamos interactuar con el servicio, por lo que podríamos darle al objeto un método de Inicio, Detención y Pausa.

Puede ver las propiedades y los métodos de un objeto pasándolo al cmdlet Get-Member. Los objetos que produce un cmdlet PowerShell son en gran parte tipos subyacentes del framework. Net, pero puede crear sus propios objetos si necesita usar un lenguaje como C # o usar el tipo PSObject.

Pipeline

Hay una gran cantidad de shells de Linux con un pipeline, lo que le permite enviar el texto que un comando genera como entrada al siguiente comando en la tubería. PowerShell lleva esto al siguiente nivel al permitirle tomar los objetos que un cmdlet genera y pasarlos como entrada al siguiente cmdlet en la tubería. El truco está en saber qué tipo de objeto devuelve un cmdlet, lo que es realmente sencillo cuando se utiliza el cmdlet Get-Member.

Get-Service |Get-Member

Por motivos que van más allá del alcance de este artículo, las propiedades y los métodos se denominan conjuntamente miembros de la clase, lo que explica por qué utiliza el cmdlet Get-Member para obtener una lista de todos los métodos y propiedades que tiene un objeto. Sin embargo, el cmdlet Get-Member también devuelve otra información importante, el tipo de objeto subyacente. En la captura de pantalla anterior, podemos ver que Get-Service devuelve objetos del tipo:

System. ServiceProcess. ServiceController

Dado que PowerShell trata con objetos y no con texto, no todos los cmdlets se pueden vincular entre sí utilizando la canalización [1].Eso significa que debemos encontrar un cmdlet que intente aceptar un objeto System. ServiceProcess. ServiceController de la canalización.

Get-Command -ParameterType System. ServiceProcess. ServiceController

Observe que hay un cmdlet llamado Stop-Service;echemos un vistazo a la ayuda para ello.

Get-Help -Name Stop-Service

Parece que el parámetro InputObject toma una matriz de objetos ServiceController como entrada. Por lo general, si ve un parámetro llamado InputObject, aceptará la entrada de Pipeline, pero solo para asegurarse de que vamos a ver la ayuda completa para ese parámetro.

Get-Help -Name Stop-Service -Full

Nuestras sospechas eran correctas. Entonces, en este punto, sabemos lo siguiente:

  • Get-Service devuelve objetos ServiceController
  • Stop-Service tiene un parámetro llamado InputObject que acepta uno o más ServiceControllers como entrada.
  • El parámetro InputObject acepta la entrada de tubería.

Usando esta información podríamos hacer lo siguiente:

Get-Service -Name 'Apple Mobile Device' |Stop-Service

Eso es todo por ahora, amigos. La próxima vez veremos cómo podemos formatear, filtrar y comparar objetos en Pipeline.

Deberes

  • Lectura en Object Pipeline

Si tienes alguna pregunta, puedes twittear @taybgibb, o simplemente dejar un comentario.