Usando Invoke-Command em uma função
-
21-12-2019 - |
Pergunta
Eu tenho esse trecho de código.A ideia é chamar um comando de invocação em um PC remoto, mas se o comando falhar, ele deverá tentar novamente.
O código fica assim:
Function Run-Command
{
param(
[Parameter(Mandatory = $true)]
[Uri[]] $ConnectionUri,
[Parameter(Mandatory = $true)]
[PSCredential] $Credential,
[Parameter(Mandatory = $true)]
[ScriptBlock] $ScriptBlock,
[Parameter(Mandatory = $true)]
[Int] $Time,
[Parameter(Mandatory = $false)]
[Object[]] $ArgumentList
)
for($retry = 0; $retry -le 10; $retry++)
{
try
{
Invoke-Command -ConnectionUri $ConnectionUri -Credential $Credential -ScriptBlock $ScriptBlock -ArgumentList $ArgumentList #-ErrorAction SilentlyContinue
if ($?)
{
break
}
Write-Verbose "Server is not ready yet . . . sleeping and trying again in $Time seconds."
Start-Sleep -Seconds $Time
}
catch
{
Write-Verbose "Server is not ready yet . . . sleeping and trying again in $Time seconds."
Start-Sleep -Seconds $Time
}
}
}
Eu deveria então ser capaz de chamar a função assim:
Run-Command -ConnectionUri $ConnectionUri -Credential $Credential -ScriptBlock $SomeScriptBlock -Time 30
Mas, por algum motivo, não funciona como eu pensava.
desde já, obrigado
Atenciosamente Magnus
Solução
Eu descobri.Para quem estiver interessado, aqui está o código:
Function Run-Command
{
param(
[Parameter(Mandatory = $true)]
[Uri[]] $ConnectionUri,
[Parameter(Mandatory = $true)]
[PSCredential] $Credential,
[Parameter(Mandatory = $true)]
[ScriptBlock] $ScriptBlock,
[Parameter(Mandatory = $true)]
[Int] $Time,
[Parameter(Mandatory = $false)]
$ArgumentList
)
for($retry = 0; $retry -le 10; $retry++)
{
try
{
if ($ArgumentList -eq $null)
{
Invoke-Command -ConnectionUri $ConnectionUri -Credential $Credential -ScriptBlock $ScriptBlock -ErrorAction SilentlyContinue
}
else
{
Invoke-Command -ConnectionUri $ConnectionUri -Credential $Credential -ScriptBlock $ScriptBlock -ArgumentList $ArgumentList -ErrorAction SilentlyContinue
}
if ($?)
{
break
}
Write-Verbose "Server is not ready yet . . . sleeping and trying again in $Time seconds."
Start-Sleep -Seconds $Time
}
catch
{
Write-Verbose "Server is not ready yet . . . sleeping and trying again in $Time seconds."
Start-Sleep -Seconds $Time
}
}
}
Suspeito que a razão para não funcionar foi que a lista de argumentos às vezes estava vazia.Então, adicionei uma verificação para decidir qual comando Invoke executar.
Espero que isso possa ajudar alguém
/Magno
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow