Usando il comando invoke all'interno di una funzione
-
21-12-2019 - |
Domanda
Ho questo snippet di codice.L'idea sta chiamando un comando invoco su un PC remoto, ma se il comando fallisce, quindi dovrebbe riprovare.
Il codice è simile a questo:
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
}
}
}
.
Dovrei quindi essere in grado di chiamare la funzione come questo:
Run-Command -ConnectionUri $ConnectionUri -Credential $Credential -ScriptBlock $SomeScriptBlock -Time 30
.
Ma per qualche motivo non funziona come pensavo.
Grazie in anticipo
Saluti Magnus
Soluzione
L'ho capito.Per chiunque sia interessato, ecco il codice:
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
}
}
}
.
I sospeso il motivo per cui non funzionava era che l'argomentazione sia a volte vuota.Quindi ho aggiunto un assegno per decidere quale invocare-comando da eseguire.
Spero che questo MIGTH? Aiuta qualcuno
/ magnus
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow