peterleb
Goto Top

System.Windows.Forms.MessageBox

Hallo Mädels und Jungs,

in einem kleinen Script soll die Anweisung

[System.Windows.Forms.MessageBox]::Show($msg, 'PowerShell', 0)  

ausgeführt werden.
Dazu wird vorher
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')  
abgearbeitet.
Seit kurzem kommt eine Fehlermeldung:
False  v4.0.30319     C:\Program Files\PowerShell\7\System.Windows.Forms.dll

Das ps1 Script wird mit
"C:\Program Files\PowerShell\7\pwsh.exe" "C:\Users\XXXXXX\AppData\Roaming\Lexware\FinanzManager\2024\DelReminder.ps1"  
aufgerufen.

Trotz Fehlermeldung erscheint die die MessageBox und nach <OK> wird das Programm sauber beendet.
Ich denke, die Sache tritt nach einem PS Update auf.

Wie löse ich das Problem?
Vielen Dank allen Mitdenkenden.
Groß
Peter

Content-ID: 92678358558

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

Ausgedruckt am: 19.12.2024 um 13:12 Uhr

mbehrens
mbehrens 07.05.2024 um 18:37:20 Uhr
Goto Top
Zitat von @PeterleB:

[System.Windows.Forms.MessageBox]::Show($msg, 'PowerShell', 0)  

Was ist mit dem DialogResult?

Dazu wird vorher
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')  

Macht man nicht eher ein
Add-Type -AssemblyName System.Windows.Forms
PeterleB
PeterleB 07.05.2024 um 18:49:28 Uhr
Goto Top
Die Box meldet, ob die Datei vorhanden war und gegebenenfalls gelöscht wurde.
OK beendet das Programm.

Den Add-Type Befehl werde probieren.

Gruß
Peter
13034433319
Lösung 13034433319 07.05.2024 aktualisiert um 20:53:57 Uhr
Goto Top
Hi.
Das ist kein Problem sondern ganz normal!
Zitat von @PeterleB:

Seit kurzem kommt eine Fehlermeldung:
False  v4.0.30319     C:\Program Files\PowerShell\7\System.Windows.Forms.dll
> 
Das ist keine Fehlermeldung!
Per Default gibt die Methode LoadPartitialWithName immer das Assembly zurück sofern es gefunden wurde, was es hier auch ganz normal tut.
Siehe dazu
https://learn.microsoft.com/de-de/dotnet/api/system.reflection.assembly. ...

Du hast nur vergessen die Ausgabe zu unterdrücken.
Willst du die Ausgabe unterdrücken machst du ein [void] davor oder pipest das Ergebnis via out-null ins Nirvana.
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')  
# oder 
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | out-null  

Außerdem ist die Methode LoadPartitialWithName mittlerweile als deprecated/veraltet markiert
Steht ebenfalls hier:
https://learn.microsoft.com/de-de/dotnet/api/system.reflection.assembly. ...

Ersatz dafür ist Load()

[void][System.Reflection.Assembly]::Load('System.Windows.Forms')  

Sie alle machen aber im Endeffekt das gleiche wie das präferierte CMDLet Add-Type mit dem Parameter -AssemblyName

Add-Type -AssemblyName System.Windows.Forms
Das gab es aber erst seit der PowerShell 3, deswegen haben diverse Skripte noch die .NET Methode drin stehen die auch schon unter der PS 2.0 funktionierte.

Hoffe das klärt dein Missverständnis damit auf. 😉

H.
PeterleB
PeterleB 08.05.2024 um 06:51:26 Uhr
Goto Top
Vielen lieben Dank für die hilfreiche Erklärung.

Gruß
Peter