Estou tentando instalar o .Net 8 SDK remotamente. Não funcionou Invoke-Command
para mim com o script abaixo. No entanto, Enter-PSSession
funcionou em uma sessão interativa.
Você pode me ajudar a entender por que as diferenças?
Invocar-Comando
invoke-command -computername Server1 {
c:\temp\dotnet-sdk-8.0.301-win-x64.exe /install /quiet /norestart
}
Enter-PSSession
PS C:\temp> Enter-PSSession -ComputerName Server1
[Server1]: PS C:\Users\blah\Documents> c:\temp\dotnet-sdk-8.0.301-win-x64.exe /install /quiet /norestart
[Server1]: PS C:\Users\blah\Documents>
Muito provavelmente, seu
c:\temp\dotnet-sdk-8.0.301-win-x64.exe
aplicativo é um aplicativo de subsistema GUI , que o PowerShell executa de forma assíncrona ; isto é, ele inicia o aplicativo, mas não espera sua conclusão.Ao usar
Invoke-Command
with um-ComputerName
argumento em vez de um objeto de sessão criado explicitamente (viaNew-PSSession
) passado para o parâmetro, você está criando implicitamente-Session
uma sessão que existe apenas durante a chamada , enquanto uma sessão inserida interativamente permanece aberta até você sair manualmente isto.Invoke-Command
Enter-PSSession
Quando uma sessão é encerrada, todos os processos ainda em execução nela são encerrados automaticamente.
Assim, se o seu instalador ainda não tiver sido concluído (o que é muito provável, dada a natureza assíncrona da chamada), ele será encerrado à força.
A solução mais simples é tornar a chamada síncrona , o que é mais facilmente realizado canalizando para
Out-Null
: [1]Observe que isso também fará com que
Invoke-Command
espere até que a instalação seja concluída.Se isso não for desejado, você poderá usar a
-AsJob
opção para retornar instantaneamente um objeto de trabalho que poderá consultar posteriormente para conclusão da instalação remota.[1] Simplesmente encaminhar a chamada para outro cmdlet faz com que o PowerShell aguarde implicitamente a conclusão da chamada. Essa técnica também faz com que o PowerShell reflita o código de saída do processo da chamada na variável automática
$LASTEXITCODE
.