andre1979
Goto Top

Powershell Abfrage im Script mit Timer

Ich möchte in einem powershell Script eine abfrage einbauen

In einem Powershell Script frage ich den Status eines Snapmirror ab und schreibe den Status in eine Variable $snapmirrorstatus

$snapmirrorstatus = Get-NaSnapmirror -Name $vol | select Status | GetUnique -asstring | FT -AutoSize -hideTableHeaders

Die Ausgabe kann "idle" oder "transferring" sein.
Erst wenn der Status "idle" ist soll das Script weiter laufen.

Wie mache ich das am besten?

Content-Key: 195886

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

Printed on: April 18, 2024 at 22:04 o'clock

Member: Friemler
Friemler Dec 14, 2012 updated at 17:31:53 (UTC)
Goto Top
Deinen Schnipsel in eine Do...While-Schleife stecken???
Member: Pjordorf
Pjordorf Dec 14, 2012 updated at 17:40:55 (UTC)
Goto Top
Hallo auch an dich "Powershell Abfrage im Script mit Timer",

Zitat von @Andre1979:
Wie mache ich das am besten?
Vielleicht so?
while ($snapmirrorstatus <> "idle"){  
    start-sleep -s 20

    $snapmirrorstatus = Get-NaSnapmirror -Name $vol | select Status | GetUnique -asstring | FT -AutoSize -hideTableHeaders
}

Gruß,
Peter

PS. Zu langsam heuteface-smile
Member: Andre1979
Andre1979 Dec 14, 2012 updated at 21:50:54 (UTC)
Goto Top
Ahhhhhh... ich habe es verstanden...

Als erstes füttern wir die Variable mit

$snapmirrorstatus = Get-NaSnapmirror -Name $vol | select Status | GetUnique -asstring | FT -AutoSize -hideTableHeaders

Dann wird mit "while ($snapmirrorstatus <> "idle")" die Bedingung abgefragt.
Da ich beim starten des Script immer davon ausgehe, das der Status "transferring" ist, ist das Ergebnis also wahr.
Dann fängt mit der "{" der Loop an, der Timer läuft mit "Start-sleep" und danach wird die Variable neu gefüllt und der Loop mit "}" beendet und die Bedingung erneut abgefragt.
Das ganze endet erst wenn die Bedingung nicht mehr erfüllt ist und der Loop somit unterbrochen wird, und der nächste Teil des Scripts abgearbeitet wird.
Member: Andre1979
Andre1979 Dec 15, 2012 at 10:39:57 (UTC)
Goto Top
Das mit der Schleife habe ich verstanden, nur lässt sich die $snapmirrorstatus Variable nicht füllen....

mit "Get-NaSnapmirror -Name $vol | select Status | FT -AutoSize -hideTableHeaders"
bekomme ich als Ausgabe "idle" oder "transferring".

möchte ich jedoch die Variable füllen:
$snapmirrorstatus = Get-NaSnapmirror -Name $vol | select Status | FT -AutoSize -hideTableHeaders
und mir diese dann mit "Write-Host $snapmirrorstatus" Ausgeben lassen, bekomme ich als Antwort:

Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartDa
ta Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.GroupEndD
ata Microsoft.PowerShell.Commands.Internal.Format.FormatEndData

Warum wird die Variable nicht gefüllt?

P.S zu meiner Verteidigung: ich blutiger Anfänger was Scripting angeht..............
Member: Andre1979
Andre1979 Dec 15, 2012 updated at 12:33:13 (UTC)
Goto Top
konnte das Problem lösen
$snapmirrorstatus = Get-NaSnapmirror -Name $vol | select Status
while ($snapmirrorstatus -cnotlike "@{Status=Idle}"){  
	Write-Host $snapmirrorstatus
    start-sleep -s 20
    $snapmirrorstatus = Get-NaSnapmirror -Name $vol | select Status
}
Write-Host $snapmirrorstatus

Aber warum funktioniert das nicht?
$snapmirrorstatus = Get-NaSnapmirror -Name $vol | select Status | FT -AutoSize -hideTableHeaders

Wer kann mir mal das Licht anmachen, bzw. wie sollte das im Optimalfall aussehen?
Member: Andre1979
Andre1979 Dec 16, 2012 at 13:27:52 (UTC)
Goto Top
Habe den Lichtschalter gefunden....
Das ganze mal auf den Status des Windows Update Dienst bezogen

$ServiceName ="wuauserv"  
$Date = Get-Date
$ServiceStatus = Get-Service -Name $ServiceName
while ($ServiceStatus.Status -cnotlike "Stopped"){  
Write-Host "am" $Date "ist der Service" $ServiceStatus.DisplayName "im Status" $ServiceStatus.Status "- erneute  Abfrage in 20 Sekunden"  
start-sleep -s 20
$ServiceStatus = Get-Service -Name $ServiceName
}

Der Denkfehler war, das $ServiceStatus ein Array und keine Variable ist.
PS C:> $ServiceName ="wuauserv"  
PS C:> $ServiceStatus = Get-Service -Name $ServiceName
PS C:> $ServiceStatus

Status   Name               DisplayName
------   ----               -----------
Running  wuauserv           Windows Update

Um jetzt sauber mit z.B dem Status zu arbeiten, muss bei der Abfrage des Array der Spaltenname angegeben werden
PS C:> $ServiceStatus.Status
Running