gfritz74
Goto Top

Messagebox - Variable nicht gespeichert

Guten Morgen zusammen,

ich bin leicht am verzweifeln. Ich habe mir eine Messagebox gemacht in der wegen einem ausstehenden Neustart gewarnt wird.
Bei Klick auf nein soll eine Variable gespeichert werden. Dies passiert aber nicht. Der Switch funktioniert wohl,
da wenn ich write-host nutze alles richtig ausgegeben wird. Hier erstmal der Code.
#Function Message Box erstellen
Function Message {

[cmdletbinding()]

Param (
[Parameter(Position=0,Mandatory,HelpMessage="Specify a display message")]  
[ValidateNotNullorEmpty()]
[string]$Message,
[ValidateSet("OkOnly","OkCancel","AbortRetryIgnore","YesNoCancel","YesNo","RetryCancel","Jetzt")]  
[string]$Button="OkOnly",  
[ValidateSet("Critical", "Question", "Exclamation", "Information")]  
[string]$Icon="Information",  
[string]$Title,
[switch]$NoPassthru
)

#load the necessary assembly
Try { 
    Add-Type -AssemblyName "Microsoft.VisualBasic" -ErrorAction Stop       
    #create the message box using the parameter values
    $returnValue = [microsoft.visualbasic.interaction]::Msgbox($message,"$button,$icon",$title)  
}
Catch {
    Write-Warning "Failed to add Microsoft.VisualBasic assembly or create the messagebox."  
    Write-Warning $error.Exception.Message
}
#do not write return value if -NoPassthru is called
if (-Not $NoPassthru) {
    Write-Output $returnValue
}

} #end function

Dieser ist für die Messagebox.
Hier der für die Anzeige der Messagebox:
Function MessageDay2 {

    $ask = message -Title "Computer Reboot Notification" -Message "Nach der Installation von Sicherheitsupdates ist ein `nNeustart des Computers zwingend erforderlich.`nBitte führen Sie diesen Zeitnah durch oder `nklicken Sie auf Ja um den Computer jetzt neu zu starten.`nVielen Dank ihr IT-Services Team`n`nHaben Sie ihre Arbeiten gesichert?" -Button YesNo -Icon Critical  
    if ($ask -eq "Yes") {  
    $msgBoxInput =  [System.Windows.MessageBox]::Show('Sind Sie bereit für den Neustart?','Reboot Confirmation','YesNo','Warning')  
    switch  ($msgBoxInput) {
        'Yes' {  
            #shutdown -r -f /t 0
             Write-Host Shutdown
              }

        'No' {  
        $Day2 = 'OK'  
            }}}
        elseif($ask -eq "No"){  
        Set-Variable -Name "Day2" -Value 'OK'  
        }}

Beide Varianten $Day2 = 'OK' als auch Set-Variable -Name "Day2" -Value 'OK' funktionieren nicht.
Hat vielleicht einer ne Idee warum das so ist?

Danke schonmal und Viele Grüße
gfritz74

Content-ID: 1258073130

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

Ausgedruckt am: 25.11.2024 um 16:11 Uhr

gfritz74
Lösung gfritz74 14.09.2021 um 09:15:53 Uhr
Goto Top
Hat sich erledigt. Ich musste die Variablen als Global setzen. Jetzt gehts.
BirdyB
BirdyB 14.09.2021 um 09:25:56 Uhr
Goto Top
Zitat von @gfritz74:

Hat sich erledigt. Ich musste die Variablen als Global setzen. Jetzt gehts.

Und das ist die schlechteste Lösung… Normalerweise arbeitet man bei Funktionen mit Rückgabewerten.
gfritz74
gfritz74 14.09.2021 um 09:42:57 Uhr
Goto Top
Ok. Und wie mach ich das?
Wäre echt nett wenn du mir da helfen würdest.
BirdyB
BirdyB 14.09.2021 um 10:11:08 Uhr
Goto Top
Zitat von @gfritz74:
Dieser ist für die Messagebox.
Hier der für die Anzeige der Messagebox:
> Function MessageDay2 {
> 
>     $ask = message -Title "Computer Reboot Notification" -Message "Nach der Installation von Sicherheitsupdates ist ein `nNeustart des Computers zwingend erforderlich.`nBitte führen Sie diesen Zeitnah durch oder `nklicken Sie auf Ja um den Computer jetzt neu zu starten.`nVielen Dank ihr IT-Services Team`n`nHaben Sie ihre Arbeiten gesichert?" -Button YesNo -Icon Critical  
>     if ($ask -eq "Yes") {  
>     $msgBoxInput =  [System.Windows.MessageBox]::Show('Sind Sie bereit für den Neustart?','Reboot Confirmation','YesNo','Warning')  
>     switch  ($msgBoxInput) {
>         'Yes' {  
>             #shutdown -r -f /t 0
>              Write-Host Shutdown
>               }
> 
>         'No' {  
>         $Day2 = 'OK'  
>             }}}
>         elseif($ask -eq "No"){  
>         return $Day2
>         }}
> 
Du verwendest einfach in der Funktion das Return-Statement und gibst damit die Variable $Day2 zurück (siehe oben)
Dann weist du den Rückgabewert einfach deiner Variable zu:
$entscheidung  = MessageDay2()

Und dann arbeitest du damit weiter... Siehe auch hier: https://theitbros.com/powershell-function-return/

VG
gfritz74
gfritz74 14.09.2021 um 10:35:27 Uhr
Goto Top
Klasse. Vielen Dank.
Will jetzt nicht nerven aber ich hätte noch 2 andere Dinge.
Es wäre echt klasse wenn Du da mal drüber schauen kannst.
Zum einem kommt noch eine Messagebox mit OkOnly.

message -Title "Computer Reboot Notification" -Message "Test" -Button OkOnly -Icon Critical  

Wie kann ich den Ok Klick abfangen und auch in einer Variable mit "OK" bei Klick ansonsten $null speichern?

Zum anderen mach ich eine Prüfung mit 2 Bedingungen die aber sehr lang wird.
Hintergrund ist das geprüft wird wann die Rechner neu gestartet worden sind.
Es soll also zum Beispiel Geprüft ob:
msgBox1 = OK und und $global:DayValue.Days = 2 usw. siehe Code

$msgBox1 -eq "OK" -and $global:DayValue.Days -eq 2 -or $global:msgBox1 -eq "OK" -and $global:DayValue.Days -eq 5  

Wenn ich den Befehl alleine für 50 Tage schreibe wird da ja ellenlang.
Gibt ess ne Chance das zu verkürzen?

Muss aber auch ein Lob aussprechen für das Forum hier.
Hier wird einem sehr gut und schnell geholfen. Hat man echt selten.

Viele Grüße
gfritz74
BirdyB
BirdyB 14.09.2021 um 10:43:45 Uhr
Goto Top
Moin,

Zu Frage 1:

Wenn du den Rückgabewert aus Zeile 22 auch weiter zurückgeben würdest, könntest du dir anschauen, was dort hinterlegt ist. Da findet sich bestimmt etwas...

zu Frage 2:
Wie wäre es mit einem:
$msgBox1 -eq "OK" -and $global:DayValue.Days -ge 2 -and $global:DayValue.Days -le 50  
?

VG
gfritz74
gfritz74 14.09.2021 um 10:55:04 Uhr
Goto Top
Hi,

zu 1 : das schau ich mir an.
zu2 : hatte ich auch gedacht. das geht aber nicht da 3 verschiedene Messageboxen aufkommen.
es muss also genau mit -eq geprüft werden.
$msgBox1 -eq "OK" -eq 1 -and $msgBox1 -eq "OK"-eq 4 -and $msgBox1 -eq "OK" eq - 7 usw. Box 1
$msgBox2 -eq "OK" -eq 2 -and $msgBox2 -eq "OK"-eq 5 -and $msgBox2 -eq "OK"-eq - 8 usw. Box 2
$msgBox3 -eq "OK" -eq 3 -and $msgBox3 -eq "OK"-eq 3 -and $msgBox3 -eq "OK"-eq - 9 usw. Box 3

Danke dir schonmal
BirdyB
BirdyB 14.09.2021 um 11:04:24 Uhr
Goto Top
Sorry, aber jetzt verstehe ich garnichts mehr...
Was soll dein Script denn genau tun? Ich habe bisher nur irgendetwas von letztem Reboot und Messagebox verstanden.
gfritz74
gfritz74 14.09.2021 um 11:15:48 Uhr
Goto Top
Ok prüft ob ein Update einen Neustart benötigt.
Falls Ja wird das aktuelle Datum und der letzte Neustart in eine Text Datei geschrieben.
Daraus errechne ich die Differenz.
Und anhand dessen sollen die Nachrichten angezeigt werden. Jetzt wird's kompliziert.
Bei Tag 1 wird die Box 1 angezeigt,
bei 2 die Box2,
und bei 3 die Box3. Diese ist ein Timer der nicht zu schließen ist.
Wenn also der Rechner also bei mehr als 3 Tagen nicht neu gestartet worden ist, soll der Anwender der sich nach z. Beispiel 20 Tagen einloggt, nicht direkt die Box 3 bekommen, sondern ab da sollen die 3 Tage laufen. Am Tag 1die Box 1. Am Nächsten Tag die Box 2 und erst am 3 Tag die dritte.

Das kriege ich bisher mit -eq hin.
gfritz74
Lösung gfritz74 14.09.2021 um 12:00:06 Uhr
Goto Top
Habs geschafft.
Habe mir alle Tage in 3 Arrays geschrieben und die Prüfung mit -contains gemacht.
Jetzt läuft es so wie es soll.
Fehlt mir nur noch das mit dem Button. Aber das kriege ich auch noch hin