2016-04-01 5 views
1

So habe ich ein Powershell-Tool mit Formen gebaut .... und es funktioniert ... es ist nichts falsch mit dem Code unten, außer für es wird nicht funktionieren in Powershell 3. Es muss 4 sein ... und ich kann nichts darüber finden, das für 4.0 spezifisch ist.Code scheint Powershell 4 zu erfordern, kann jedoch nicht sehen, warum

Ich habe blickte durch alle Technet-Seiten für die Cmdlets Ich verwende und sie alle haben die gleichen Funktionen aufgelistet für 3 und 4

Irgendwelche Ideen?

Grundfunktion ist dies ...

  1. It 4 Texte Boxen löscht.

  2. es schaut auf eine checkboxlist und vorausgesetzt, nur ein Element wird überprüft es wird lesen Sie die Daten in dieser Datei und suchen Sie nach Wörtern, die mit # beginnen.

  3. Wenn es eine Übereinstimmung größer als 4 in der Länge findet ... nehme ich an, dass eine einzelne Variable gefunden wird, da alle diejenigen, die wir sein werden, mehr als 4 Buchstaben lang sein werden. Ich habe das getan, denn wenn nur einer gefunden wird, wird die .count nicht funktionieren. Aber wenn 4 Übereinstimmungen auftreten, wird die .length 4 sein. Das gleiche als ob die Länge eines einzelnen Elements 4 wäre. Wenn die Länge 4 oder weniger ist, verarbeite ich als 4 oder weniger individuelle Variable.
  4. ich diese in den Text und AccessibleName Felder auf dem Formular

dann in jedem Fall passieren jetzt .. ich die Statusleiste aktualisieren.

Nichts besonderes.

$btn_LoadOptions = New-Object System.Windows.Forms.Button 
$btn_LoadOptions.Font = New-Object System.Drawing.Font("Consolas", 8.25) 
$btn_LoadOptions.Location = New-Object System.Drawing.Point(156, 184) 
$btn_LoadOptions.Size = New-Object System.Drawing.Size(168, 23) 
$btn_LoadOptions.TabIndex = 11 
$btn_LoadOptions.Text = "Load Options" 
$btn_LoadOptions.UseVisualStyleBackColor = $true 
$btn_LoadOptions.add_Click({btn_LoadOptions_Click($btn_LoadOptions)}) 

function btn_LoadOptions_Click($object) 
{ 
    clean-messageboxes 
    if ($cbl_DefaultMessageChoices.CheckedItems.Count -eq 1) 
    { 
     $regex = [regex]'(#\w+)' 
    $found = Select-String -Pattern $regex -path $messagechoice -AllMatches | % { $_.Matches } | % { $_.Value } 
    if ($found.Length -gt 4) 
    { 
     $tb_MessageOption1.Text = $found 
     $tb_MessageOption1.AccessibleName = $found 
    } 
    else 
    { 
     $tb_MessageOption1.Text = $found[0] 
     $tb_MessageOption1.AccessibleName = $found[0] 
     $tb_MessageOption2.Text = $found[1] 
     $tb_MessageOption2.AccessibleName = $found[1] 
     $tb_MessageOption3.Text = $found[2] 
     $tb_MessageOption3.AccessibleName = $found[2] 
     $tb_MessageOption4.Text = $found[3] 
     $tb_MessageOption4.AccessibleName = $found[3] 
    } 
    $sb_TOC_PowerTools.Text = "Message Options Loaded" 
} 
else 
{ 
    $sb_TOC_PowerTools.Text = "No message choosen" 
} 
} 

function clean-messageboxes 
{ 
$tb_MessageOption1.Text = "" 
$tb_MessageOption2.Text = "" 
$tb_MessageOption3.Text = "" 
$tb_MessageOption4.Text = "" 
} 
+0

und ja, ich weiß, dass ich einen kürzeren Code im else verwenden könnte {} –

+0

Könntest du ein wenig über "wird nicht funktionieren" sagen? Verhält es sich anders? Wirft es Fehler? –

+0

so ... wenn ich auf die Schaltfläche auf dem Formular klicke .. Wenn Sie Powershell 3 installiert haben .. nichts passiert .. wenn Sie 4 installiert haben .. die Datei gelesen wird, und die Optionen 1 bis 4 von ihnen laden in die Boxen keine Probleme. –

Antwort

4

Sie erwähnen in den Kommentaren, die Sie die $messagechoice Variable wie folgt vergeben:

$global:messagechoice = $pgmessagedefaults_path + "\" + ($cbl_DefaultMessageChoices.CheckedItems.ForEach({$f = ($_ + ".txt");return $f})) 

Die .ForEach({}) Erweiterungsmethode ist a PowerShell 4.0 feature, was erklärt, warum es nicht in Powershell 3.0 funktioniert

Verwenden Sie stattdessen das Cmdlet ForEach-Object:

$global:messagechoice = $pgmessagedefaults_path + "\" + ($cbl_DefaultMessageChoices.CheckedItems |ForEach-Object {$_ + ".txt"}) 
+0

Yup .. das ist, was ich dachte, nachdem ich den Fehler sah .. Ich schaute diesen Befehl auf. Ich gebe das einen Versuch, um sicherzustellen, dass es funktioniert ... Da ich $ f = tun musste, return $ f .. kann ich diesen Befehl so machen. '$ global: messagechoice = $ pgmessagedefaults_path + "\" + ($ cbl_DefaultMessageChoices.CheckedItems | ForEach-Objekt {$ f = ($ _ + ".txt"); return $ f}) ' es schien nicht anders zu funktionieren, ohne dass .. Ich konnte nicht einfach das $ _ machen. ".txt" -Teil ... der Weg war so durcheinander –

Verwandte Themen