1
resposta

Erro ao executar o $service.start e $service.stop para qualquer serviço.

Tentei executar o $service.start e $service.stop para o wuauserv, MySQL e AudioSRV, localmente. Em todos eles só recebo o erro abaixo. Todos os serviços estão em execução ou invertendo o comando para startar. O powershell foi executado tbm como modo administrator.

Veja um exemplo:

PS C:\Program Files\PowerShell\7> $service = Get-Service -name MySQL
PS C:\Program Files\PowerShell\7> $service

Status   Name               DisplayName
------   ----               -----------
Stopped  MySQL              MySQL

PS C:\Program Files\PowerShell\7> $service.status
Stopped
PS C:\Program Files\PowerShell\7> if ($service.status -eq "Stopped") {
>> $service.Start()
>> $service.Stop()
>> }
MethodInvocationException:
Line |
   2 |  $service.Start()
     |  ~~~~~~~~~~~~~~~~
     | Exception calling "Start" with "0" argument(s): "Cannot open 'MySQL' service on computer '.'."
MethodInvocationException:
Line |
   3 |  $service.Stop()
     |  ~~~~~~~~~~~~~~~
     | Exception calling "Stop" with "0" argument(s): "Cannot open 'MySQL' service on computer '.'."
1 resposta

Olá Vinicius, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

Os erros, Exception calling "Start" with "0" argument(s) e Exception calling "Stop" with "0" argument(s) , estão sendo apresentados devido ao tempo de execução do script está ocorrendo antes da efetiva parada dos serviços, fazendo com que ocorra a tentativa de inicialização de um serviço antes mesmo de o mesmo mudar para o status Stopped gerando erro.

Uma forma de contornar este erro será utilizarmos o método WaitForStatus que permite definir um ponto de espera no script até que o serviço tenha o status que foi definido no método, no nosso caso esperaremos o status Stopped. Adicionaremos este método dentro da estrutura da condicional if, ficando como apresentado abaixo:

$servico = Get-Service -Name "AudioSRV" 

if ($servico.Status -eq "Running") {
  $servico.Stop()
  $servico.WaitForStatus("Stopped")
  echo "Serviço finalizado"
  $servico.Start()
  echo "Serviço iniciado"
} else {
  echo "Serviço não estava executando!"
}

Dessa forma, o comando $servico.Start() será chamado apenas quando o status do serviço mudar efetivamente para Stopped, como apresentado no GIF abaixo:

GIF contendo a exibição da execução do script apresentado anteriormente a este GIF

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!