Geek School trabajando con colecciones en PowerShell
Dado que PowerShell se basa en .Net Framework e incorpora varias otras tecnologías como WMI y CIM, siempre hay más de una forma de lograr lo mismo. Únase a nosotros en este breve post donde aprenderemos cómo elegir el mejor método para realizar nuestras tareas..
Asegúrese de leer los artículos anteriores de la serie:
- Aprenda cómo automatizar Windows con PowerShell
- Aprendiendo a usar cmdlets en PowerShell
- Aprender a usar objetos en PowerShell
- Aprendizaje de formato, filtrado y comparación en PowerShell
- Aprende a usar el control remoto en PowerShell
- Uso de PowerShell para obtener información de la computadora
Y estad atentos para el resto de la serie toda la semana..
Usando Cmdlets de Lote
Anteriormente en la serie, cuando le presentamos la tubería, le mostramos cómo puede tomar los objetos que genera un cmdlet y pasarlos como entrada a otro cmdlet usando algo como esto:
Get-Process -Nombre de bloc de notas | Proceso de parada
Esto mataría cualquier proceso con el nombre de "bloc de notas". Pero probablemente se esté preguntando cómo PowerShell puede eliminar cada instancia del bloc de notas con un solo comando. La respuesta se encuentra en la ayuda del cmdlet Stop-Process..
ayuda Stop-Process -Full
Si observa la última línea de código en la sección de sintaxis, puede ver que el parámetro InputObject acepta un objeto de tipo Proceso [], y cada vez que vea un tipo seguido de dos corchetes, significa que el parámetro acepta uno o mas del tipo anterior. En este caso, acepta uno o más objetos de proceso. Técnicamente, diríamos que el cmdlet InputObject acepta un proceso formación. Cuando tenga un cmdlet que admita las operaciones por lotes de esta manera, utilícelo. Esta es la elección número uno.
Usando WMI
A pesar de que WMI no es la mejor tecnología para enviar desde la sede de Microsoft, ocupa el segundo lugar en la lista de cómo trabajar con colecciones de objetos. Podríamos obtener fácilmente una lista de los procesos en ejecución de la clase Win32_Process como:
Get-WmiObject -Class Win32_Process
Dado que la consulta WMI devuelve su propio tipo de objeto, deberá buscar un método que pueda detener el proceso, así que vamos a canalizarlo a Get-Member.
Get-WmiObject -Class Win32_Process | Get-Member
Parece que lo más cercano a detenerse es el método de terminación, por lo que debe ser el uno. Para llamar a un método en un objeto WMI, simplemente canalícelo a Invoke-WmiMethod y especifique el nombre del método.
Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invocar-WmiMethod -Nombre Terminar
Genial, que hizo el truco. Cada vez que obtenga un ReturnValue de 0 en WMI, recuerde que el comando se ejecutó correctamente.
Enumeración
Si falla los otros dos métodos, si tiene que hacer algo a un grupo de objetos, puede enumerar todo el objeto y actuar sobre cada objeto individual. Primero tienes que encontrar el método que usarías para detener un solo proceso..
Proceso de obtención | Método Get-Member -MemberType
Perfecto, parece que podemos usar el método Kill y luego colarnos en ForEach-Object para matarlos a todos..
Get-Process -Nombre de bloc de notas | ForEach-Object -Process $ _. Kill ()
Aquí tomamos todos los objetos de proceso que Get-Process devolvió y los pasamos al cmdlet ForEach-Object. Al igual que en el cmdlet Where-Object, representamos cada objeto en la canalización con $ _ que pudimos llamar al método Kill (). Con todo lo dicho y hecho, la enumeración de una colección es mucho más lenta que los métodos anteriores y solo se debe usar como último resultado.
Resumen
Elige uno
Get-Process -Nombre de bloc de notas | Proceso de parada
Opción Dos
Get-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invocar-WmiMethod -Nombre Terminar
Elección tres
Get-Process -Nombre de bloc de notas | ForEach-Object -Process $ _. Kill ()
Eso es todo por ahora, amigos, nos vemos la próxima semana para más diversión de PowerShell..