none
Auswahl eines Wertes durch den User aus einem Array RRS feed

  • Frage

  • Hallo,

    gibt es die Möglichkeit,das sich ein Benutzer aus einem Array einen bestimmten Wert auswählen kann. Über eine GUI möchte ich das nicht lösen, sondern würde gerne in der Konsole bleiben! 

    Als Beispiel ich habe ein Array mit 80 Mail Adressen und der Benutzer des Script soll sich einen aus diesen 80 Mail Adressen auswählen! Und das ganze sollte in der Konsole funktionieren!

    Gruß

    Christian

    Mittwoch, 10. Februar 2016 12:53

Antworten

  • Für bis zu 10 Auswahlmöglichkeiten, sicher. Da kann man ein simples Menu bauen, wie früher. :) Aber bei 80 Mailadressen?

    Echt nicht. Man könnte sich sicher auch einen Hack mit Autocompletion ausdenken, wenn die User ein paar Zeichen tippen. Die frage ist aber warum man sich den Aufwand machen sollte wenn die beste Lösung viel naheliegender ist. Mir ist auch nicht klar warum du es deinen Usern so schwer machen willst. Wir haben das Jahr 2016 und Consolen-Menüs sind sowas von 90er... :)

    Ernsthaft: Bedenke das auch wenn dich eine Console nicht stört, User hassen die Dinger. Und mehr noch, die schalten ihr Hirn ab. Wir haben mal vor Jahren ein lustiges Experiment gemacht und 50 Usern die gleiche Fehlermeldung in einem Fall per Console (sogar in ROT) und im anderen per Popup präsentiert. Beim Popup gab es 40 Hotline-Calls, bei der Console 2.  (mehr zum Thema: Why GUIs are good)

    Ich würde es so lösen:

    $mailAddresses = ("sdasd@ddfsf.net","ououoizu@fdssd.com","ssdfdsfds@dsfds.org")
    
    function FnShowDialog {
    	[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    	 #~~< Form1 >~~~~~~~~~~~~~~~~~~~~~~~~~~
    	$Form1 = New-Object System.Windows.Forms.Form
    	$Form1.ClientSize = "347, 86"
    	$Form1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 9.75, [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0)))
    	$Form1.FormBorderStyle = "FixedToolWindow"
    	$Form1.MaximizeBox = $false
    	$Form1.MinimizeBox = $false
    	$Form1.BackColor = "White"
    	#~~< Label1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    	$Label1 = New-Object System.Windows.Forms.Label
    	$Label1.Location = "13, 13"
    	$Label1.Size = "217, 23"
    	$Label1.Text = "Bitte Mailadresse wählen:"
    	#~~< Button1 >~~~~~~~~~~~~~~~~~~~~~~~~~ 
    	$Button1 = New-Object System.Windows.Forms.Button
    	$Button1.Location = "259, 41"
    	$Button1.Size = "76, 26"
    	$Button1.Text = "OK"
    	$Button1.add_MouseClick({
    		$script:selectedMailAdr = $ComboBox1.SelectedItem
    		$Form1.dispose()
    	})
    	#~~< ComboBox1 >~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    	$ComboBox1 = New-Object System.Windows.Forms.ComboBox
    	$ComboBox1.Location = "12, 40"
    	$ComboBox1.SelectedIndex = -1
    	$ComboBox1.DropDownStyle = "DropDownList"
    	$ComboBox1.Size = "231, 24"
    	$ComboBox1.Items.AddRange($mailAddresses)
    	
    	$Form1.Controls.Add($Label1)
    	$Form1.Controls.Add($Button1)
    	$Form1.Controls.Add($ComboBox1)
    	[System.Windows.Forms.Application]::Run($Form1)
    }
    
    
    FnShowDialog
    Write-Host $selectedMailAdr
     
    Die Mailadressen kannst du z.b. einfach per Get-content in die Variable am Anfang einlesen.
    So wie es oben ist, kannst du diesen Dialog auch ein ansonsten Consolen-basiertes Script einbauen, ohne das es seltsam wirkt.
    Grüße, Denniver



    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 10. Februar 2016 13:52
    Moderator
  • Mit Out-GridView und dem Parameter -OutputMode kannst du dir Array in einer Art Tabelle anzeigen lassen und die Selektion an die nächste Pipeline-Position übergeben. Das mache ich recht oft, geht aber nicht mit PowerShell 2.0 (das bei uns leider noch auf vielen Rechnern ist).

    Siehe hierzu auch:

    https://blogs.technet.microsoft.com/heyscriptingguy/2015/04/30/select-history-via-powershell-out-gridview/

    Mittwoch, 10. Februar 2016 15:02
  • Es ist natürlich auch noch möglich, dass du dir eine HashTable baust, in die du alle deine Werte als Values einträgst und als Key kannst du einen durchlaufenden Zähler nehmen. Diese Tabelle lässt du dir dann sortiert ausgeben und machst dahinter eine Eingabeaufforderung: "Geben Sie die Indexnummern aller Elemente an, die Sie verwenden möchten." Dann kann man in der Konsole ein kommagetrenntes Array eingeben. Das nimmst du dann wieder auseinander, lässt es in einer Schleife durch die Werte der HashTable ersetzen und dann hast du auch deine Werte. Geht aber nur mit wenigen Elementen, da du dich sonst tot-scrollst.

    Das ist zumindest meine Lösung für alle PowerShell 2.0-Rechner ohne GridView-Passthru.

    Donnerstag, 11. Februar 2016 12:49
  • Hi,

    das ist dann quasi so wie unter DOS-Zeiten :-)

    Dein Array enthält z.B. 80 User, somit kannst du das über eine Schleife ausgeben:

    $count = 1
    
    $users = Import-Csv -Path C:\Listen.txt -Delimiter "," -Header "Name","EMail"
    
    foreach ($user in $users)
    {
    
      write-host $count ") " $user.Name "  " $user.EMail
      $count++
    
    }
    
    $choice = Read-Host -Prompt 'Auswahl:'
    
    write-host "Sie haben gewählt: " $users[$choice-1].EMail

    Vielleicht hilft dir das schon mal weiter.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 10. Februar 2016 13:39

Alle Antworten

  • Hi,

    das ist dann quasi so wie unter DOS-Zeiten :-)

    Dein Array enthält z.B. 80 User, somit kannst du das über eine Schleife ausgeben:

    $count = 1
    
    $users = Import-Csv -Path C:\Listen.txt -Delimiter "," -Header "Name","EMail"
    
    foreach ($user in $users)
    {
    
      write-host $count ") " $user.Name "  " $user.EMail
      $count++
    
    }
    
    $choice = Read-Host -Prompt 'Auswahl:'
    
    write-host "Sie haben gewählt: " $users[$choice-1].EMail

    Vielleicht hilft dir das schon mal weiter.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 10. Februar 2016 13:39
  • Für bis zu 10 Auswahlmöglichkeiten, sicher. Da kann man ein simples Menu bauen, wie früher. :) Aber bei 80 Mailadressen?

    Echt nicht. Man könnte sich sicher auch einen Hack mit Autocompletion ausdenken, wenn die User ein paar Zeichen tippen. Die frage ist aber warum man sich den Aufwand machen sollte wenn die beste Lösung viel naheliegender ist. Mir ist auch nicht klar warum du es deinen Usern so schwer machen willst. Wir haben das Jahr 2016 und Consolen-Menüs sind sowas von 90er... :)

    Ernsthaft: Bedenke das auch wenn dich eine Console nicht stört, User hassen die Dinger. Und mehr noch, die schalten ihr Hirn ab. Wir haben mal vor Jahren ein lustiges Experiment gemacht und 50 Usern die gleiche Fehlermeldung in einem Fall per Console (sogar in ROT) und im anderen per Popup präsentiert. Beim Popup gab es 40 Hotline-Calls, bei der Console 2.  (mehr zum Thema: Why GUIs are good)

    Ich würde es so lösen:

    $mailAddresses = ("sdasd@ddfsf.net","ououoizu@fdssd.com","ssdfdsfds@dsfds.org")
    
    function FnShowDialog {
    	[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    	 #~~< Form1 >~~~~~~~~~~~~~~~~~~~~~~~~~~
    	$Form1 = New-Object System.Windows.Forms.Form
    	$Form1.ClientSize = "347, 86"
    	$Form1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 9.75, [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0)))
    	$Form1.FormBorderStyle = "FixedToolWindow"
    	$Form1.MaximizeBox = $false
    	$Form1.MinimizeBox = $false
    	$Form1.BackColor = "White"
    	#~~< Label1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    	$Label1 = New-Object System.Windows.Forms.Label
    	$Label1.Location = "13, 13"
    	$Label1.Size = "217, 23"
    	$Label1.Text = "Bitte Mailadresse wählen:"
    	#~~< Button1 >~~~~~~~~~~~~~~~~~~~~~~~~~ 
    	$Button1 = New-Object System.Windows.Forms.Button
    	$Button1.Location = "259, 41"
    	$Button1.Size = "76, 26"
    	$Button1.Text = "OK"
    	$Button1.add_MouseClick({
    		$script:selectedMailAdr = $ComboBox1.SelectedItem
    		$Form1.dispose()
    	})
    	#~~< ComboBox1 >~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    	$ComboBox1 = New-Object System.Windows.Forms.ComboBox
    	$ComboBox1.Location = "12, 40"
    	$ComboBox1.SelectedIndex = -1
    	$ComboBox1.DropDownStyle = "DropDownList"
    	$ComboBox1.Size = "231, 24"
    	$ComboBox1.Items.AddRange($mailAddresses)
    	
    	$Form1.Controls.Add($Label1)
    	$Form1.Controls.Add($Button1)
    	$Form1.Controls.Add($ComboBox1)
    	[System.Windows.Forms.Application]::Run($Form1)
    }
    
    
    FnShowDialog
    Write-Host $selectedMailAdr
     
    Die Mailadressen kannst du z.b. einfach per Get-content in die Variable am Anfang einlesen.
    So wie es oben ist, kannst du diesen Dialog auch ein ansonsten Consolen-basiertes Script einbauen, ohne das es seltsam wirkt.
    Grüße, Denniver



    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 10. Februar 2016 13:52
    Moderator
  • Mit Out-GridView und dem Parameter -OutputMode kannst du dir Array in einer Art Tabelle anzeigen lassen und die Selektion an die nächste Pipeline-Position übergeben. Das mache ich recht oft, geht aber nicht mit PowerShell 2.0 (das bei uns leider noch auf vielen Rechnern ist).

    Siehe hierzu auch:

    https://blogs.technet.microsoft.com/heyscriptingguy/2015/04/30/select-history-via-powershell-out-gridview/

    Mittwoch, 10. Februar 2016 15:02
  • Dem stimme ich zu, aber die Personen, die damit arbeiten wollen/sollen lieben die Konsole! Daher bin ich auf der Suche nach einer Lösung!

    Mit einer GUI habe ich mir das auch schon zurecht gebastelt! Aber wie gesagt, es wäre super das auch in der Konsole zu haben! Da geht die Arbeit einfach schneller!

    Donnerstag, 11. Februar 2016 12:13
  • Das mit dem Out-GrdView finde ich schon eine nette Lösung, gegenüber der Programmierung einer GUI! Eine Zeile Code und fertig!

    Das ist zwar noch nicht das was ich suche, den meine Kollegen und auch ich lieben die Konsole und wollen so wenig wie möglich die Maus nutzen!

    Danke schon mal für eure Vorschläge!

    Donnerstag, 11. Februar 2016 12:21
  • Vielleicht erklärst du mal etwas genauer, wie du die idealerweise die Lösung vorstellst und warum die anderen nicht ausreichend sind.
    Du hast nun die Menue-Listen-Version innerhalb der Console. Das ist das was geht. Für meine Begriffe schneller und übersichtlicher ist die Dropdown-Box Version im Zusatzfenster. Diese kannst du sogar so bauen, das man sie komplett mit der Tastatur bedienen kann, als sei sie Teil der Konsole. Da die automatisch in den Vordergrund poppt, ist das praktisch seemless mit der Console. Du kannst das Fenster sogar noch blau machen und den nen RasterFont benutzen, damit es Konsoliger aussieht. :)

    Es gibt keine Möglichkeit eine Dropdown-Box in die Console einzubauen, bzw. schon, aber dann musst du dir eine eigene Console bauen. Geht, keine Frage. Etwas mehr Aufwand vielleicht.

    Die einzige Variante, die ich mir noch minimal schneller für einen versierten User/Admin vorstellen kann, ist wie eingangs erwähnt auf Usereingaben per einer Art Autocomplete die Mailadresse zu vervollständigen. Also aus "He" wird dann "Heinz.Mueller@yzd.com". Das umzusetzen wird aber nicht simpel, obs überhaupt je zufriedenstellen gehen wird, fraglich. Macht auch überhaupt nur Sinn, wenn der User die auszuwählenden Daten bereits genau kennt und der daher weiß welche Buchstaben er tippen muß.
    Wenn ich's es recht überlege, da Autocompletion deutlich einfacher im Zusatzfenster umzusetzen ist, macht das eben gesagte auch nicht wirklich Sinn. Der Zeitgewinn ist minimal, aber der Aufwand beträchtlich höher.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Donnerstag, 11. Februar 2016 12:37
    Moderator
  • Es ist natürlich auch noch möglich, dass du dir eine HashTable baust, in die du alle deine Werte als Values einträgst und als Key kannst du einen durchlaufenden Zähler nehmen. Diese Tabelle lässt du dir dann sortiert ausgeben und machst dahinter eine Eingabeaufforderung: "Geben Sie die Indexnummern aller Elemente an, die Sie verwenden möchten." Dann kann man in der Konsole ein kommagetrenntes Array eingeben. Das nimmst du dann wieder auseinander, lässt es in einer Schleife durch die Werte der HashTable ersetzen und dann hast du auch deine Werte. Geht aber nur mit wenigen Elementen, da du dich sonst tot-scrollst.

    Das ist zumindest meine Lösung für alle PowerShell 2.0-Rechner ohne GridView-Passthru.

    Donnerstag, 11. Februar 2016 12:49
  • Vielen Dank für eure Mühe! Ich denke ich werde erstmal das Out-GrdView bemühen. Da hat man noch einen schönen Filter drin und ich kann mehre Daten mit anzeigen lassen! Werde aber weiter an einer Lösung suchen, bzw selber erstellen!

    Donnerstag, 11. Februar 2016 15:20