11Sep
Dado que PowerShell está basado 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 esta breve publicación donde aprendemos a elegir el mejor método para realizar nuestras tareas.
Asegúrese de leer los artículos anteriores de la serie:
- Aprenda a automatizar Windows con PowerShell
- Aprenda a usar los cmdlets en PowerShell
- Aprendizaje de cómo usar objetos en PowerShell
- Aprendizaje Formato, filtrado y comparación en PowerShell
- Aprenda a usar Remoting enPowerShell
- que usa PowerShell para obtener información de la computadora
Y permanezca atento al resto de la serie durante toda la semana.
Uso de los cmdlets por lotes
Anteriormente en la serie, cuando le presentamos la interconexión, le mostramos cómo puede tomar los objetos que un cmdlet genera y pasarlos como entrada a otro cmdlet usando algo como esto:
Get-Process -Nombre de la libreta |Stop-Process
Esto mataría cualquier proceso con el nombre "notepad".Pero probablemente se esté preguntando cómo PowerShell puede matar cada instancia de bloc de notas con un solo comando. La respuesta se encuentra dentro de la ayuda del cmdlet Stop-Process.
help 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 Process [], y siempre que vea un tipo seguido de dos corchetes cuadradosque significa que el parámetro acepta uno o más del tipo anterior. En este caso, acepta uno o más objetos de proceso. Técnicamente, diríamos que el cmdlet InputObject acepta un array de proceso. Siempre que tenga un cmdlet que admita operaciones por lotes de esta manera, úselo. Esta es la elección número uno.
Uso de WMI
Aunque WMI no es la mejor pieza de tecnología para enviar desde el HQ de Microsoft, sí aparece en segundo lugar en la lista de cómo trabajar con colecciones de objetos. Podríamos obtener fácilmente una lista de procesos en ejecución de la clase Win32_Process de la siguiente manera:
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, por lo queVamos a conectarlo a Get-Member.
Get-WmiObject -Class Win32_Process |Get-Member
Parece que lo más parecido a detenerse es el método de terminación, por lo que debe ser el indicado. Para invocar 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'" |Invoke-WmiMethod -Name Termina
Genial, eso fue lo que hizo. Siempre que obtenga un ReturnValue de 0 en WMI, simplemente recuerde que el comando se ejecutó correctamente.
Enumeración
Al fallar los otros dos métodos, si tiene que hacer algo con un grupo de objetos, puede enumerar el objeto completo y actuar sobre cada objeto individual. Primero debe encontrar el método que usaría para detener un solo proceso.
Get-Process |Get-Member -MemberType Method
Perfecto, parece que podemos usar el método Kill y luego pasar a ForEach-Object para matarlos a todos.
Get-Process -Name bloc de notas |ForEach-Object -Process{ $ _. Kill()}
Aquí tomamos todos los objetos de proceso devueltos por Get-Process y los pasamos al cmdlet ForEach-Object. Al igual que el cmdlet Where-Object, representamos cada objeto en la tubería con $ _ que pudimos llamar al método Kill() .Con todo lo dicho y hecho, enumerar una colección es mucho más lento que los métodos anteriores y solo debe usarse como último resultado.
Resumen
Choice One
Get-Process -Name bloc de notas |Stop-Process
Choice Two
Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Terminar
Elección Tres
Get-Process -Name 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.