Script para iniciar/detener varios servicios con PowerShell

windows_powershell

 

Quería compartirles un post que hace poco escribir sobre un uso practico de powershell en nuestras vidas cotidianas como desarrolladores.

Introducción

Para todo desarrollador, su computador es su estación de trabajo, en ella desempeñan diferentes labores, digamos que el 100% del tiempo no se utilizan para desarrollar. El resto de tiempo, necesitamos que nuestra PC dedique toda su capacidad de procesamiento a las tareas que nosotros necesitemos.

Para el Desarrollo, los servicios de los que mas requerimos son de los Motores de Bases de Datos, pero en otra actividad, no lo necesitamos.

Objetivo

Optimizar el uso de la CPU y de la Memoria RAM descartando servicios innecesarios y levantándolos solo cuando sea necesario.

Este objetivo es relativamente fácil de conseguir utilizando todo el potencial de Scripting de PowerShell[1]. Lo que haremos es un Script el cual pasemos un parámetro de “Inicio” o de “Parada”, y que realice estas acciones sobre los servicios listados en un archivo de texto.

Administrando Servicios

Para nosotros levantar o detener los servicios[3] cuando nosotros queramos, tenemos que indicar que estos van a ser administrados manualmente. Podemos hacer esto por 2 caminos, directamente por el Administrador de Servicios de Windows o directamente con PowerShell:

Administrador de Servicios de Windows PowerShell
image

  1. Panel de Control
  2. Buscar Services(Servicios)
  3. View Local Services(Ver Servicios Locales)
image

  1. Abrir PowerShell como Administrador
image
Identificamos los servicios a Manipular y Verificamos si el modo de inicio es Automático o Manual.
Si es Manual, continuar con los siguientes pasos.
image
Verificamos el nombre de los servicios con:
Get-Service -Name *sql*

Cambiamos la Propiedad Startup Type con el comando:
Set-Service -StartupType Manual –Name <Nombre del Servicio>

Y Listo, nuestros servicios solo inician cuando nosotros lo indiquemos.

image 
Entramos a las propiedades del Servicio:

  1. Click Derecho sobre el Servicio
  2. Propiedades

Verificamos que el Servicio se inicie Manualmente.

Después de dar Click en Ok, nuestros servicios solo inician cuando nosotros lo indiquemos.

 

 

Manos a la Obra!

Como se dijo anteriormente, vamos a iniciar y a detener los servicios que se listen en un archivo de texto. Creamos nuestro archivo de Texto, y ponemos los servicios en el archivo de texto en el orden en el que se van a iniciar:

image

Este orden será revertido para detener los servicios.

Para leer un archivo desde PowerShell utilizamos el comando:

Get-Content <Ruta hacia el archivo>

image 

Este comando lee liana por línea el archivo.

Para iniciar los servicios utilizamos el comando:

Start-Service <Nombre del Servicio>

Para detenerlo:

Stop-Service <Nombre del Servicio>

Para verificar su estado con:

Get-Service -Name <Nombre del Servicio>

Resultado:

image

Ya tenemos el archivo donde están alojados los nombres de los servicios, ya sabemos como administrar servicios desde PowerShell, nos queda es realizar el script.

para crear el Script, creamos un archivo con la extensión “.ps1” desde el bloc de notas, o directamente desde el Power Shell ISE.

El script es sencillo, solo le pasaremos un parámetro para indicarle si inicia o detiene los servicios, este parámetro será el texto “start” ó “stop”.

El diagrama de flujo de nuestro Script es:

powershell

Ya sabemos leer el archivo, ya sabemos manipular los servicios. Nos falta leer parámetros y manejar arreglos.

Para manejar parámetros simplemente los declaramos al inicio del script:

Param(
[string]$Action
)

Ya con esto tenemos un parámetro fuertemente tipado (solo admite cadenas) en el cual vamos a guardar, como ya se había dicho, el “start” y “stop”.

Para manejar los arreglos, que es donde debemos poner todo el contenido del archivo línea por línea para recorrerlo inversamente, simplemente descargamos todo el contenido del archivo a un arreglo mediante la línea:

$Services = Get-Content $SvcTxtPath 

Se puede hacer esto ya que Get-Content devuelve un arreglo línea por línea del archivo leído.

para determinar el numero de líneas, ya que lo vamos a necesitar para el algoritmo de recorrido hacia atrás del arreglo, lo hacemos mediante:

[int]$lineCount = (Get-Content $SvcTxtPath ).Count

Y Listo. teniendo en cuenta estos detalles y el diagrama de flujo de lo que queremos hacer, nos da como resultado el siguiente script.

#autor qjuanp
#http://qjuanp.blogspot.com

Param(
[string]$Action
)
$SvcTxtPath = "D:JuanDocumentsPsScriptsdevelopServices.txt"
#echo $Action
if($Action.Equals("start")){
	"Iniciando Servicios"
	Get-Content $SvcTxtPath | Start-Service
	"Servicios Iniciados"
	}
elseif($Action.Equals("stop")){
	"Deteniendo Servicios"
	[int]$lineCount = (Get-Content $SvcTxtPath ).Count
	#echo $lineCount
	$Services = Get-Content $SvcTxtPath 
	#echo $Services[1]
	for([int]$i=$lineCount-1; $i -ge 0;$i--){
		"Stop Service: $Services[$i]"
		Stop-Service -Force -Name $Services[$i]
		}
	"Servicios Detenidos"
	}
else {"Error"}

Ya tenemos listo nuestro script, ahora vamos a hacerlo fácil de acceder.

Antes de poder ejecutar el Script debemos habilitar la ejecución de los mismos, ya que por seguridad, solo se permite la ejecutar Scripts que hayan sido firmados digitalmente, para fines prácticos, deshabilitaremos esta propiedad y en futuras ocasiones veremos como se firman los scripts digitalmente.

Ejecutamos PowerShell con premisos de administrador:

image

y ejecutamos la siguiente instrucción y respondemos “Si” a la pregunta:

Set-ExecutionPolicy remotesigned

image

Creando los accesos directos a la ejecución del Script

Simplemente damos click derecho en el lugar donde queremos nuestros accesos directos (yo lo voy a hacer sobre el escritorio), vamos a la opción “Nuevo”-> “Acceso Directo”:

image

dentro de la la ubicación del item:

image

Dentro del cuadro de texto ponemos la línea:

%SystemRoot%system32WindowsPowerShellv1.0powershell.exe 
         -File "D:JuanMy PowerShell Scriptsdevelop.ps1" 
         -Action start

 

y variamos el parámetro “Action” a “stop” para crear el acceso directo para detener los servicios.

Un truco adicional, cuando ya tengamos listo los accesos, vamos a las propiedades:

image

Luego, en la pestaña de “Acceso Directo”, vamos a las opciones avanzadas y activamos la casilla de “Ejecutar como administrador”.

image

Asi nuestro script se ejecutará como administrador y así podrá detener o iniciar los servicios sin problema!

 

A disfrutar com más espacio disponible en nuestra RAM!, solo cuando sea necesario iniciaremos los servicios que son necesarios para nuestra actividad de desarrollo!


 

1. Se utilizara PowerShell en su Versión 1.0

2. Para este punto PowerShell debe estar instalado

3. Para este caso, utilizaremos 2 servicios usados comúnmente en el desarrollo por tratarse del Motor de Base de Datos, que pertenecen a SQL Server 2008 Express Edition. Todo lo desarrollado en este tutorial se puede realizar con cualquier servicio registrado en Windows.

4 comentarios sobre “Script para iniciar/detener varios servicios con PowerShell”

  1. La verdad a mi me ha parecido muy comodo PowerShell, ya que el autocompletado y las ayudas(dentro de la shell get-help ), ademas, el lenguaje de scripting es muy similar a C#, si haz trabajado con C# te acostumbraras facil a él. PowerShell trae otra particularidad que la hace sobre salir sobre las que tu mencionas, y es que es orientada a objetos, de ahi que la manipulacion del sistema se haga de una manera mas comprensible y facil. Aca te dejo el enlace a un blog de Geeks.ms donde encontraras una guia sobre PowerShell: http://geeks.ms/blogs/vista-tecnica/archive/tags/PowerShell/default.aspx

Responder a qjuanp Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *