grmg2010
Goto Top

Invoke-Command wiederholen falls keine Verbindung möglich

Moin,

ich möchte innerhalb eines Skriptes auf einem entfernten Hosts einen Befehl ausführen. Das ist grundsätzlich kein Problem mit Invoke-Command. Jetzt verhält es sich allerdings so, dass das entfernte System nicht unbedingt auf den ersten Versuch reagiert, sich per Invoke-Command anzusprechen. Daher meine Idee, dass ich versuche den Befehl auszuführen und bei scheitern eine Fehlermeldung auszugeben und dann nach einem Delay einen weiteren Versuch zu unternehmen.
Bei der Fehlermeldung soll es sich um eine eigene Fehlermeldung handeln, nicht die automatisch von PowerShell erzeugte.

Ich hatte überlegt, ob es mit Try-Catch so umsetzbar wäre, meine ersten Versuche damit hatten aber nur das Ergebnis, dass nicht der Catch-Block ausgeführt wurde,
try {
        $RemoteVar = Invoke-Command -ComputerName $Host -Credential $cred -ScriptBlock {
    
            $adapter = Get-NetIPAddress | Where-Object {$_.IPAddress -like "x.x.x.x"}  
            $mac = Get-NetAdapter -Name $adapter.InterFaceAlias
            return $mac.MacAddress
        
           }
        
        $RemoteVar | Out-File -FilePath "D:\MAC.txt"  
        Write-Host "Getting MAC address for $Host was successful."  
        Read-Host -Prompt "Press any key to exit."  
        exit
        
    }
    catch {
        Write-Host -ForegroundColor Red "Connecting to $Host was not possible. Retrying..."  
        Start-Sleep -Seconds 15
    }


Gibt es sonst noch eine andere Möglichkeit zu prüfen, ob eine Verbindung mittels Invoke-Command aktuell schon möglich ist?

Viele Grüße

Content-ID: 53200128923

Url: https://administrator.de/contentid/53200128923

Ausgedruckt am: 09.11.2024 um 01:11 Uhr

SlainteMhath
SlainteMhath 07.03.2024 um 15:50:51 Uhr
Goto Top
Moin,

um den try...catch-Block nochmal einen while ($TRUE) ... packen. Der "exit" in Zeile 15 sollte das ganze dann beenden

lg,
Slainte
11078840001
Lösung 11078840001 07.03.2024 aktualisiert um 16:07:29 Uhr
Goto Top
meine ersten Versuche damit hatten aber nur das Ergebnis, dass nicht der Catch-Block ausgeführt wurde
Der Grund:
Damit CMDlets eine Exception auslösen und damit den Catch muss der Parameter -ErrorAction des jeweiligen CMDlets auf Stop festgelegt sein. (-ErrorAction Stop)
Oder die globale Variable gesetzt sein wenn es für alle Fehler und CMDLets gelten soll .
$erroractionpreference = 'Stop'
https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell ...

$maxtries = 10
$cnt = 1
while($cnt -le $maxtries){
     try {
        $RemoteVar = Invoke-Command -ComputerName $Host -Credential $cred -ErrorAction Stop -ScriptBlock {
    
            $adapter = Get-NetIPAddress | Where-Object {$_.IPAddress -like "x.x.x.x"}    
            $mac = Get-NetAdapter -Name $adapter.InterFaceAlias
            return $mac.MacAddress
          }
        
        $RemoteVar | Out-File -FilePath "D:\MAC.txt"    
        Write-Host "Getting MAC address for $Host was successful."    
        Read-Host -Prompt "Press enter key to exit."    
        exit
    } catch {
        Write-Host -ForegroundColor Red "Connecting to $Host was not possible. Retrying..."    
        Start-Sleep -Seconds 15
        $cnt++
    }
}
grmg2010
grmg2010 08.03.2024 um 06:50:07 Uhr
Goto Top
Zitat von @SlainteMhath:

Moin,

um den try...catch-Block nochmal einen while ($TRUE) ... packen. Der "exit" in Zeile 15 sollte das ganze dann beenden

lg,
Slainte

Moin,

vielen Dank für den Hinweis, so in der Art wollte ich das auch lösen. Meine aktuelle Problematik ist allerdings, dass ich im Fehlerfall gar nicht in den Catch-Block hineinkomme.

Zitat von @11078840001:

Der Grund:
Damit CMDlets eine Exception auslösen und damit den Catch muss der Parameter -ErrorAction des jeweiligen CMDlets auf Stop festgelegt sein. (-ErrorAction Stop)

Vielen Dank, dies scheint mein Fehler gewesen zu sein, dass ich nicht festgelegt hatte, dass gestoppt werden soll.

Viele Grüße