none
Skript sich in der ISE ausführen, per Rechtsklick "Mit Powershell ausführen" aber nicht. RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein Skript geschrieben, in welchem ich unter anderem Forms verwende (speziell die Checkbox).
    Wenn ich dieses Skript über den "grünen Pfeil" oben in der ISE ausführe, funktioniert alles wie gewollt.

    Wenn ich nun aber (was eigentlich das Ziel ist) auf die .ps1 Datei einen Rechtsklick mache und "Mit PowerShell ausführen" auswähle, bekomme ich folgenden Fehler:

    Fehler beim Aufrufen der Methode, da [System.Windows.Forms.CheckBox] keine Methode mit dem Namen "op_Addition" enthält...

    Der Fehler liegt also bei dem += Operator, mit denen ich mehrere Checkboxen verknüpfe um später den Namen der ausgewählten Boxen auszulesen.

    Wie kann es sein, dass dieser Fehler auftritt und - viel wichtiger - wie kann ich ihn beheben?

    Vielen Dank schon mal! :-)



    • Bearbeitet german_erd Mittwoch, 7. August 2019 10:34
    Mittwoch, 7. August 2019 10:19

Antworten

  • Hast du du die globale Variable am Anfang des Scripts auch korrekt als Array definiert?

    $global:checkboxes = @()

    • Als Antwort markiert german_erd Donnerstag, 8. August 2019 10:59
    Donnerstag, 8. August 2019 08:27

Alle Antworten

  • Ggf. fehlt das laden der benötigten Types (Assemblies), die von der IDE automatisch geladen werden.
    Mittwoch, 7. August 2019 11:28
  • Am Anfang des Skritps lade ich folgendes:

    Add-Type -AssemblyName System.Windows.Forms

    [System.Windows.Forms.Application]::EnableVisualStyles()

    Sollte also eigentlich passen, oder nicht?

    Mittwoch, 7. August 2019 11:39
  • Dann wäre der Code jetzt schon mal interessant, was immer du mit "+=" hinzufügen willst, scheint eben als Operation für das Objekt nicht definiert zu sein.
    Mittwoch, 7. August 2019 18:25
  • Ich gehe durch den $customer Array und erstelle eine Checkbox für jeden Kunden in diesem Array:

    foreach ($c in $customer) {
        $cbheight                                           += 20
        $checkBox                                           = New-Object System.Windows.Forms.CheckBox
        $checkBox.Font                                      = "Microsoft Sans Serif,14"
        $checkBox.Name                                      = "$c"
        $checkBox.Text                                      = "$c"
        $checkbox.Location                                  = New-Object System.Drawing.Size (20, $cbheight)
        $checkbox.Size                                      = New-Object System.Drawing.Size (345, 23)
        $checkBox.SendToBack()
        $checkBox.checked                                   = $true
        $objForm.Controls.Add($checkBox)
        $global:checkboxes                                  += $checkbox
    }

    Der Fehler tritt dann bei der letzten Zeile auf. Aber wie gesagt nur, wenn ich das ganze "Mit Powershell ausführe". Wenn ich das Skript in der ISE ausführe, klappt alles. Das gilt auch für den Fall, wenn ich vorher alle Variablen lösche.

    Ich erstelle diese Variable, damit ich mit:

    $global:selectedCusts = $global:checkboxes | Where-Object {$_.Checked} |Select -Expand Name

    später die ausgewählten Checkboxes abgreifen kann

    Donnerstag, 8. August 2019 06:13
  • Hast du du die globale Variable am Anfang des Scripts auch korrekt als Array definiert?

    $global:checkboxes = @()

    • Als Antwort markiert german_erd Donnerstag, 8. August 2019 10:59
    Donnerstag, 8. August 2019 08:27
  • Genau das hat das Problem gelöst - das habe ich schlichtweg vergessen... Danke bfuerchau!

    Ich verstehe zwar noch nicht so ganz, wieso es dann in der ISE funktioniert, sonst nicht (ich cleane ja am Start alle Variablen) aber ich beschwere mich nicht

    Donnerstag, 8. August 2019 11:01
  • Da die ISE ggf. intelligenter als Powershell selber ist, hat diese das Verhalten ggf. analysiert und automatisch ein Array angelegt. Sauberer Programmierstil ist das allerdings nicht.
    Zumal ja die Powershell sowieso nicht typsicher ist:
    Jede Zuweisung kann den Typ der Variablen ändern.

    Donnerstag, 8. August 2019 11:05