26 de abril de 2009

Controlando Serviços do Windows com Batch Files

Batch Files ? Aqueles Batch Files do MS-DOS ? Confesso que apelei no título ... Nos primórdios da Microsoft e até não muito tempo atrás, automatizar tarefas de forma nativa no Sistema Operacional era algo restrito aos famigerados arquivos de lote - os batches. Restritos quando ao número de comandos disponíveis e pobres na sintaxe, tinham, portanto, campo de ação bastante limitado. Desde o Windows 98, a Microsoft inclui em seus sistemas operacionais um componente chamado Windows Script Host, que permite executar VBScripts e JavaScripts como se fossem nativos. Basta criar um arquivo com extensão VBS ou JS com os comandos desejados e o Windows entende como se fosse um programa qualquer, podendo até mesmo ser incluído como uma tarefa agendada.

Qual é a vantagem disso ? Bom, uma linguagem de script é uma linguagem de programação e, portanto, tem muito mais recursos sintáticos que o batch tradicional : você pode criar variáveis, ter laços de controle, desvios condicionais mais robustos, etc. Mas a grande flexibilidade está nos recursos de COM introduzidos pela Microsoft : é possível automatizar tarefas relacionadas a qualquer software que disponibilize suas funções através de interfaces COM. Isso inclui softwares como Excel, Word, ADO (para acesso a Banco de Dados), etc.. Para fora do mundo Microsoft, também há exemplos de softwares que expõe seus objetos dessa maneira : o SAP Business One, o Acrobat Reader, Quick Time, etc.

Voltando ao assunto do título, o acesso aos Serviços do Windows também é possível através de COM. Como em meu computador na ABC71 há muitos serviços que têm uso em poucos momentos, acabei criando "batches" com scripts para iniciá-los antes de acessar o programa que vai necessitar de tal serviço e, ao fechar o programa, encerrar o serviço que não é mais necessário.

Reproduzo abaixo o exemplo comentado que inicia serviços para o VMWare :


' Nome do computador onde estão os serviços.
' o ponto indica que é o computador local
strComputer = "."

' GetObject obtém instância de um objeto existente. No caso, o nome
' esquisito no parâmetro represen
ta o gerenciamento do Windows
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

' Executa uma query no gerente para saber quais são os serviços
' existentes. Note o WHERE : ele
está filtrando apenas os serviços
'VMWare.
Se desejar ver todos os serviços, remova esse filtro.
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where DisplayName like 'VMWare%'")

' Põe em execução todos os serviços encontrados
For each objService in colServiceList
Wscript.Echo objService.StartService()
Next

' Cria uma instância do objeto COM WScript.Shell, que representa o
' ambiente Windows - arquivos, pastas
e o registro.
Set WshShell = WScript.CreateObject("WScript.Shell")

' Executa o VMWare, especificando que o script deve aguardar o tér-
'mino da execução antes de prosseguir

WshShell.Run """C:\Program Files\VMware\VMware Server\" &_
"vmware.exe""",
0, true

' Finalmente, interrompe os serviços quando o programa terminar.
For each objService in colServiceList
Wscript.Echo objService.StopService()
Next

Salvei este arquivo como StartVMWare.vbs e criei um atalho para ele : basta um duplo clique nesse atalho para executar a automação.

A propósito, os arquivos BAT ainda existem e continuam podendo ser usados pelos saudosistas ...

Nenhum comentário :

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.