Estou trabalhando em alguns comandos/scripts do PowerShell para parar, iniciar ou reiniciar uma instância de serviço SSAS Tabular usando Invoke-Command
e alguns arquivos $variables
. O objetivo final é, eventualmente, colocar esse código em um trabalho de agente para facilitar a reinicialização do serviço, mas isso está além do escopo desta postagem - preciso fazer isso funcionar com o $variables
primeiro.
Estou usando o PowerShell 5.0 em minha máquina de origem (local) e tentando parar/iniciar/reiniciar uma instância remota do servidor Tabular SSAS 2012 (11.0.6540.0).
Primeiro, começo meu script com Set-ExecutionPolicy
.
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force
Em seguida, usando o método codificado apenas para obter a sintaxe correta e observando o SQL Server Configuration Manager (Config Mgr) enquanto o RDP é inserido no servidor para verificar se o comando está funcionando, uso este código do PowerShell:
Invoke-Command -ComputerName DevServer { stop-service 'MSOLAP$TABULAR' }
Isso funciona muito bem. Eu verifico no Config Mgr que o serviço para.
Também verifico se os 2 scripts de código do PowerShell abaixo funcionam:
Invoke-Command -ComputerName DevServer { start-service 'MSOLAP$TABULAR' }
e
Invoke-Command -ComputerName DevServer { restart-service 'MSOLAP$TABULAR' }
Excelente. Funciona bem.
Agora eu começo a colocar as coisas em variáveis assim:
$tabularinstance = 'MSOLAP$TABULAR'
$server = "DevServer"
$stop = "stop-service $tabularinstance"
$start = "start-service $tabularinstance"
$restart = "restart-service $tabularinstance"
Em seguida, mostro os valores das variáveis para verificar os resultados esperados:
# show values
$tabularinstance
$stop
$start
$restart
$server
E recebo os seguintes resultados retornados no console do PowerShell:
PS H:\> # show values
$tabularinstance
$stop
$start
$restart
$server
MSOLAP$TABULAR
stop-service MSOLAP$TABULAR
start-service MSOLAP$TABULAR
restart-service MSOLAP$TABULAR
DevServer
OK, então as coisas parecem boas. Em seguida, executo o comando PowerShell abaixo, esperando que funcione, mas nada acontece no servidor; Config Mgr não mostra que o serviço está parado, ainda está em execução:
Invoke-Command -ComputerName $server { $stop }
Percebi então que a $tabularinstance
variável não possui apóstrofos de encapsulamento, então tentei o seguinte:
$tabularinstance = '''MSOLAP$TABULAR''' # triple apostrophes needed to get the ' escape character and apply the apostrophes to variable
e, em seguida, redefina as variáveis $stop
, $start
e $restart
para usar as $tabularinstance
variáveis atualizadas:
$stop = "stop-service $tabularinstance"
$start = "start-service $tabularinstance"
$restart = "restart-service $tabularinstance"
e mostre-os novamente para verificar se eles incluem os apóstrofos:
PS H:\> # show values
$tabularinstance
$stop
$start
$restart
$server
'MSOLAP$TABULAR'
stop-service 'MSOLAP$TABULAR'
start-service 'MSOLAP$TABULAR'
restart-service 'MSOLAP$TABULAR'
DevServer
Sim, eles fazem. Eu então tento o meu InvokeCommand
novamente:
Invoke-Command -ComputerName $server { $stop }
Negativo. Ainda não funcionou. No ConfigMgr, o serviço ainda está em execução.
Eu até pensei em tentar atribuir o comando completo à variável para ver como tudo se resolve:
$test = "Invoke-Command -ComputerName $server { $stop }"
E depois confira os resultados:
PS H:\> $test
Invoke-Command -ComputerName DevServer { stop-service 'MSOLAP$TABULAR' }
Isso parece certo para mim também. Parece exatamente o mesmo comando que fiz ao codificar tudo em vez de usar $variables
.
Então, por que meu PowerShell não está funcionando usando o $variables
método? O que está a faltar?
O bloco de script funciona um pouco diferente quando se trata de passar variáveis. Você deve informar ao comando o que a variável contém no computador remoto.
Além disso, se você quiser passar o comando completo como uma variável, precisará no tipo da variável como
[scriptblock]
.Isso precisa ser alterado para algo assim (nomes de variáveis alterados para atender ao meu exemplo):
O outro jeito: