Gosto muito de trabalhar com Powershell. Não fiz muitas coisas ainda, mas o que eu fiz tem sido bem divertido.
Uso muito para automatizar pequenas tarefas que demoram para executar. Vou mostrar hoje um arquivo .ps1 que você pode criar para solicitar o início ou a parada de um serviço NT. Para ajudar, ele vai usar alguns scripts de elevação (para o Vista) publicados na MSDN Magazine americana ano passado, na edição de Junho. Se você resolver por para rodar o script que está aqui, vai precisar dele. Coloquei a elevação para que o script possa rodar, já que no Windows Vista não dá para parar ou iniciar serviços sem elevar. Ver o status de um serviço é possível, e por isso não solicito elevação nesse caso.
Para iniciar ou parar um serviço, é só chamar o nome do script, seguido do nome do serviço (se estiver parado ele inicia e vice-versa):
Servico.ps1 MSSQLSERVER
Para parar é só chamar com parâmetro off:
Servico.ps1 MSSQLSERVER off
Para iniciar é só chamar com parâmetro on:
Servico.ps1 MSSQLSERVER on
Para saber o status é só chamar com parâmetro query:
Servico.ps1 MSSQLSERVER query
Você vai precisar assinar o script para rodar. Para isso, veja as instruções no próprio Powershell:
get-help about_signing
Se tiverem problema para assinar me digam que posto aqui como fazer.
Vejam o script comentado:
#variáveis
$ligar = $FALSE
$desligar = $FALSE
$query = $FALSE
$Acao = $Args[1]
$servico = $Args[0] #"MSSQLSERVER"
#se o parametro não foi passado, exibe o funcionamento:
if ($servico -eq $null)
{
Write-Host "O serviço não foi especificado." `
-ForegroundColor DarkRed
"Para rodar este script chame o nome do arquivo `
PS1 (Servico.ps1), mais o nome do serviço `
(por exemplo, ""MSSQLSERVER""). "
""
"Por exemplo:"
"Servico.ps1 MSSQLSERVER"
"Você também pode especificar se quer iniciar o serviço:"
"Servico.ps1 MSSQLSERVER on"
""
"Desligar o serviço:"
"Servico.ps1 MSSQLSERVER off"
""
"Ou somente saber se ele está rodando:"
"Servico.ps1 MSSQLSERVER query"
""
return
}
#se não há ação verifica se o serviço está ligado,
#se estiver desliga e vice-versa
if ($Acao -eq $null)
{
#verificando se está ligado
if ((Get-Service $servico).STATUS -eq "Stopped")
{
$ligar = $TRUE
}
else
{
$desligar = $TRUE
}
}
else
{
#se for parâmetro de query, anota:
if (($Acao.ToString().ToUpper() -eq "QUERY") `
-or ($Acao.ToString().ToUpper() -eq "Q"))
{
$query = $TRUE
}
else
{
#se for para ligar, anota:
if (($Acao.ToString().ToUpper() -eq "ON") `
-or ($Args[0] -eq "1"))
{
$ligar = $TRUE
}
else
{
$desligar = $TRUE
}
}
}
if ($ligar)
{
#inicia o serviço, se der pau, guarda
Start-Service $servico -ErrorAction silentlycontinue `
-ErrorVariable erro
if ($erro -ne $null)
{
if ($erro[0].ToString().Contains("Cannot open " `
+ $servico + " service on computer"))
{
#se por causa da elevação, então eleva:
Write-Host "Não está elevado." `
-ForegroundColor DarkRed
elevate powershell -command `
"C:\users\giovanni\desktop\teste.ps1" $Args
return
}
}
#msg de ok:
Write-Host "O serviço $servico foi ligado." `
-ForegroundColor Blue
Read-Host "Clique para continuar"
}
if ($desligar)
{
#para o serviço, se der pau, guarda
Stop-Service $servico -Force -ErrorAction `
silentlycontinue -ErrorVariable erro
if ($erro -ne $null)
{
if ($erro[0].ToString().Contains("Cannot open " + `
$servico + " service on computer"))
{
#se por causa da elevação, então eleva:
Write-Host "Não está elevado." `
-ForegroundColor DarkRed
elevate powershell -command `
"C:\users\giovanni\desktop\teste.ps1" $Args
return
}
}
#msg de ok
Write-Host "O serviço $servico foi desligado." `
-ForegroundColor Blue
Read-Host "Clique para continuar"
}
#verificando se o serviço está rodando:
if ($query)
{
if ((Get-Service $servico).STATUS -eq "Stopped")
{
Write-Host "O serviço $servico está desligado." `
-ForegroundColor Blue
}
else
{
Write-Host "O serviço $servico está ligado." `
-ForegroundColor Blue
}
}