
newbi2009
Members-
Gesamte Inhalte
31 -
Registriert seit
-
Letzter Besuch
Alle erstellten Inhalte von newbi2009
-
Guten Tag und ein "frohes, neues jahr" zusammen. Ich habe ein Problem, bei dem ich gedacht habe, dass das eigentlich ein "Klax" sein müsste- ich hänge aber jetzt schon seit 2 Stunden daran, ohne wirklich weiter zu kommen: Ich habe eine CSV-Datei (erstellt aus einer Excel Arbeitsmappe), aus der ich einige Daten in ein Array schieben möchte (ich brauche also alle Zeilen, ab Zeile 6). Diese CSV sieht so aus: in den ersten 5 Zeilen dieser CSV-Datei steht ausschliessslich Datenmüll, der aus der Datei herausgeschnitten werden soll! zum Beispiel die Überschrift aus der Excel Datei, aus der diese CSV entstanden ist Schmitz;Harald;Schmitz@zuHause.de;123456; ;Heiner;;234567; Müller;;Mueller@zuHause.de;; Maier;Susanne;;456789 ;;;;;;;;;;;;;; Da diese Datei keinen brauchbaren Header hat, will ich mir den selber erstellen . Dazu lese ich die o.g. Datei ab Zeile 6 ein $csvContent = Get-Content C:\temp\Test.csv | select -skip 5 ..erstelle mir meinen Header $csvHeader = 'Nachname;Vorname;Email;PersonalNummer' ....setze mir daraus eine Variable zusammen und speicher diese als CSV-Datei wieder ab $xyz=$csvHeader,$csvContent > C:\temp\Test2.csv ....nun lese ich diese neue Datei in ein Array wieder ein $ergebnis = @(import-csv -path C:\temp\Test2.csv -delimiter ";" -encoding utf8 ) ...und kann dieses auch abfragen. $ergebnis[1] $ergebnis[1].Personalnummer Das funktioniert einwandfrei! Mein Problem ist, dass ich es mir sparen möchte, den Inhalt von $xyz als csv abzuspeichern und neu einzulesen. Aber jeder Versuch, das zu umgehen scheitert irgendwie kläglich. Hat da jemand eine Idee, wie ich da vorgehen muss? vielen Dank Holgw
-
Powershell GUI-Funktion-Werteübergabe (Objektübergabe?)
newbi2009 hat einem Thema erstellt in: Windows Forum — Scripting
Hallo zusammen, ich probiere mich gerade an Funktionen im Zusammenspiel mit Powershell-GUI-Programmierung und habe folgendes Problem. Ich habe mir überlegt, wenn ich ein Programm mit vielen Fenstern programmiere und in jedem Fenster einen Teil gleich haben möchte (zum Beispiel ein Logo oder ein CopyRight-Hinweis o.ä.) dann muss das doch mit Hilfe von einer Funktion zu machen sein, sodass ich den Code für den "gleichen Teil" nicht in jedem Fenster eintippen muss. Daher habe ich mir folgendes Test-Programm erstellt. Hier möchte ich jetzt den CopyRight-Hinweis, der in der Funktion steckt, in das Startfenster und in das 2. Fenster einfügen. Nur leider fehlt es mir komplett an einer Idee, wie ich den Aufruf der Funktion machen muss und wie ich dann innerhalb der Funktion, diesen copyRight Hinweis für das Start oder zweite_Fenster sichtbar mache (Es muss ja als letzte Zeile dann quasi $Startfenster.Controls.Add($copyRight) oder $zweites_Fenster.Controls.Add($copyRight) dort erscheinen) Set-StrictMode -Version 5 function copyright([string]$Fenster){ $copyRight = New-Object System.Windows.Forms.Button $copyRightFont = New-Object System.Drawing.Font("Calibri",9,[System.Drawing.FontStyle]::Italic) $copyRight.Font = $copyRightFont $copyRight.Location = New-Object System.Drawing.Size(1,150) $copyRight.Size = New-Object System.Drawing.Size(105,20) $copyRight.Forecolor = "gray" $copyRight.Text = "@CopyRight-Inhaber" $Startfenster.Controls.Add($copyRight) #oder $zweites_Fenster.Controls.Add($copyRight) } #---------------------------Hauptfenter-------------------------------------------------- $Startfenster = New-Object System.Windows.Forms.Form $Startfenster.Backcolor="white" $Startfenster.StartPosition = "CenterScreen" $Startfenster.Size = New-Object System.Drawing.Size(400,200) $Startfenster.Text = "dies ist das erste Fenster" copyright -Fenster Startfenster #----------------------button zum 2. Fenster---------------------------------------- $button = New-Object System.Windows.Forms.Button $button.Backcolor="lightblue" $button.Location = New-Object System.Drawing.Size(50,50) $button.Size = New-Object System.Drawing.Size(100,33) $button.Text = "zum zweiten Fenster" $button.Add_Click({ #----------------------zweites Fenster------------------------------------------------- $zweites_Fenster = New-Object System.Windows.Forms.Form $zweites_Fenster.Backcolor="white" $zweites_Fenster.StartPosition = "CenterScreen" $zweites_Fenster.Size = New-Object System.Drawing.Size(400,200) $zweites_Fenster.Text = "dies ist das zweite Fenster" copyright -Fenster zweites_Fenster $zweites_Fenster.ShowDialog() }) $Startfenster.Controls.Add($button) $Startfenster.ShowDialog() Ich hoffe, ich habe mich einigermassen verständlich ausgedrückt und Ihr könnt mir helfen? vielen Dank Holger -
Powershell GUI – Function outsourcing
newbi2009 antwortete auf ein Thema von newbi2009 in: Windows Forum — Scripting
Oha - Ich habe echt noch soooo viel zu lernen!!! Danke schonmal, dass Ihr Euch die Zeit nehmt! Ich versuche das alles einmal von vorne zu erklären: Ich habe edas folgende Skript, das so funktioniert, wie es soll $objForm = New-Object System.Windows.Forms.Form $objForm.Backcolor="white" $objForm.StartPosition = "CenterScreen" $objForm.Size = New-Object System.Drawing.Size(800,500) $objForm.Text = "Mein neues Fenster" $Close = New-Object System.Windows.Forms.Button $Close.Backcolor="lightblue" $Close.Location = New-Object System.Drawing.Size(1,1) $Close.Size = New-Object System.Drawing.Size(200,50) $Close.Text = "Fenster schließen" $Close.Name = "Abbrechen" $Close.DialogResult = "Cancel" $Close.Add_Click({$objForm.Close()}) $objForm.Controls.Add($Close) $btn1 = New-Object System.Windows.Forms.Button $btn1.Location = New-Object System.Drawing.Size(530,190) $btn1.Size = New-Object System.Drawing.Size(150,50) $btn1.Text = "Funktion auslagern-Test" $btn1.UseVisualStyleBackColor = $True $btn1.add_Click{($objForm.Controls.Add($done))} $objForm.Controls.Add($btn1) $done = New-Object System.Windows.Forms.Button $doneFont = New-Object System.Drawing.Font("Calibri",18,[System.Drawing.FontStyle]::Bold) $done.Font = $doneFont $done.Location = New-Object System.Drawing.Size(320,200) $done.Size = New-Object System.Drawing.Size(150,50) $done.ForeColor="red" $done.Text = "DONE!" $done.Add_Click({ $objForm.Controls.Remove($done), $objForm.Controls.refresh() }) $objForm.ShowDialog() Jetzt möchte ich, um die Code-Menge in dieser Datei zu verringern und um den "done-Knopf" auch aus anderen Fenstern zu benutzen (dieses Fenster heisst $objForm das nächste Fenster heisst vielleicht $objForm2), ohne den Quellcode für den Knop immer wieder neu zu tippen, in eine Funktion auslagern, die in einer eigenen Datei abgelegt seiin soll (D:\temp\Knopf.ps1) Dazu habe ich 2 Dateien erstellt. Die Erste Datei ist diese: . D:\temp\done-Knopf-Ver1.ps1 $objForm = New-Object System.Windows.Forms.Form $objForm.Backcolor="white" $objForm.StartPosition = "CenterScreen" $objForm.Size = New-Object System.Drawing.Size(800,500) $objForm.Text = "Mein neues Fenster" $Close = New-Object System.Windows.Forms.Button $Close.Backcolor="lightblue" $Close.Location = New-Object System.Drawing.Size(1,1) $Close.Size = New-Object System.Drawing.Size(200,50) $Close.Text = "Fenster schließen" $Close.Name = "Abbrechen" $Close.DialogResult = "Cancel" $Close.Add_Click({$objForm.Close()}) $objForm.Controls.Add($Close) $btn1 = New-Object System.Windows.Forms.Button $btn1.Location = New-Object System.Drawing.Size(530,190) $btn1.Size = New-Object System.Drawing.Size(150,50) $btn1.Text = "Funktion auslagern-Test" $btn1.UseVisualStyleBackColor = $True $btn1.add_Click{(done)} $objForm.Controls.Add($btn1) $objForm.ShowDialog() und die dazu gehörige "Funktions-Datei" (D:\Temp\done-Knopf-ver1.ps1) sieht so aus: function done() { $done = New-Object System.Windows.Forms.Button $doneFont = New-Object System.Drawing.Font("Calibri",18,[System.Drawing.FontStyle]::Bold) $done.Font = $doneFont $done.Location = New-Object System.Drawing.Size(320,200) $done.Size = New-Object System.Drawing.Size(150,50) $done.ForeColor="red" $done.Text = "DONE!" $done.Add_Click({ $objForm.Controls.Remove($done), $objForm.Controls.refresh() }) $objForm.Controls.Add($done) } Hier habe ich noch im "Controls.Add und Remove Statement" manuell den Fensternamen des Fensters eingetragen, indem der Knopf erscheinen soll ($objForm). Dies soll aber ja auch für andere Fenster funktionieren, also möchte ich den Fensternamen an diese Funktion beim Aufruf mit übergeben, damit dies auch für z.B. das Fenster "$objForm2" funktioniert! Allerdings habe ich hier bereits das Problem, dass zwar das $objForm.Controls.Add($done) funktioniert, aber das Ausblenden beim betätigen des Knopfes $objForm.Controls.Remove($done) funktioniert schon nicht mehr- was ich nicht verstehe..... So im letzten Schritt - und das ist das Problem, das ich ursprünglich gepostet habe, möchte ich den aktuellen Fenstername an die Funktion done-Funktion übergeben, damit ich diese aus verschiedenen Fenstern heraus benutzen kann..... Ich hoffe, mein Problem ist jetzt klarer dargestellt?! Nochmal vielen Dank für Eure Hilfe!! Gruß Holger -
Powershell GUI – Function outsourcing
newbi2009 antwortete auf ein Thema von newbi2009 in: Windows Forum — Scripting
nein, sorry. Ich glaube dass Du hier nicht richtig liegst. das Objekt objForm hat keine Methode .Name. Es gibt also kein objForm.Name Mit der Deklaration $objForm = New-Object System.Windows.Forms.Form habe ich ein neues Fenster-Objekt generiert und diesem direkt den Namen $objForm zugewiesen Ich habe die Variable schon absichtlich mit einem String gefüllt, damit ich später in der Funktion diesen String als Teils des Befehls wieder nutzen kann, den ich absetzen möchte... Ich habe das jetzt so gelöst, dass ich den kompletten Befehl in die Variable geschrieben habe $done_show = {$objForm.Controls.Add($done)} und in der Funktion den Befehl mit . $done_show ausführe -
Powershell GUI – Function outsourcing
newbi2009 antwortete auf ein Thema von newbi2009 in: Windows Forum — Scripting
Ja, danke - habe ich gesehen und meine Frage gerade abgeändert Aber die Antwort hilft mir nicht so wirklich, um ehrlich zu sein - was muss ich denn anstellen, damit ich meine gewünschte Ausgabe hinbekomme? ... auch wenn ich denkompletten Befehl, den ich in der Funktion brauche im Hauptfenster als String in eine Variable schreibe $done_show = 'objForm.Controls.Add($done)' und diese Variable dann an die Funktion übergebe $btn5.add_Click{(done $done_show)} abgeänderte Funktion sieht dann so aus function done { param ($done_show) $done = New-Object System.Windows.Forms.Button $doneFont = New-Object System.Drawing.Font("Calibri",18,[System.Drawing.FontStyle]::Bold) $done.Font = $doneFont $done.Location = New-Object System.Drawing.Size(320,200) $done.Size = New-Object System.Drawing.Size(150,50) $done.ForeColor="red" $done.Text = "DONE!" write-host $done_show $done_show $done.Add_Click({ $WindowName.Controls.Remove($done), $WindowName.Controls.refresh() }) $done_show } wird beim Ausführen der write-host-Befehl richtig ausgeführt aber die letzte Zeile ($done_show) wird einfach ignoriert. Ich brauche aber als letzte ausgeführte Zeile ein objForm.Controls.Add($done) -
Powershell GUI – Function outsourcing
newbi2009 hat einem Thema erstellt in: Windows Forum — Scripting
Hallo Forum, I habe ein Problem, bei dem ich hoffe, dass Ihr mir helfen könnt: Ich habe ein Fenster per Powershell mit dem Namen "$objForm" gebaut $objForm = New-Object System.Windows.Forms.Form in dieses Fensterhabe ich (unter Anderem) einen Knopf (mit namen $btn5) eingebaut. Wird dieser Knopf gedrückt, soll eine Funktion (mit dem namen done) aufgerufen werden und eine Variable ($WindowName) übergeben werden. Diese Funktion soll einen "Done-Knopf" in das geöffnete Fenster-Formular einbblenden. (Das Ganze funktioniert einwandfrei, solange ich den Code nicht als Funktion auslagere) In dem "Hauptfenster-Formular" habe ich 'objForm' an die Variable $WindowName übergeben (das ist ja der Name des Fenster-Formulares) $WindowName ='objForm' um die Funktion dann aufzurufen, wird beim Betätigen des entsprechnden Knopfes folgendes ausgeführt (also Aufruf der Funktion "done" mit Übergabe der Varibale "$WindowName") $btn5.add_Click{(done $WindowName)} Meine Funktion sieht so aus : function done { param ($WindowName) $done = New-Object System.Windows.Forms.Button $doneFont = New-Object System.Drawing.Font("Calibri",18,[System.Drawing.FontStyle]::Bold) $done.Font = $doneFont $done.Location = New-Object System.Drawing.Size(320,200) $done.Size = New-Object System.Drawing.Size(150,50) $done.ForeColor="red" $done.Text = "DONE!" write-host 'Hello' write-host $WindowName $WindowName $done.Add_Click({ $WindowName.Controls.Remove($done), $WindowName.Controls.refresh() }) $WindowName.Controls.Add($done) } Starte ich das Programm jetzt (Drücke also den Knopf 5 im Hauptfenster-Formular), bekomme ich foilgende Meldung: Hello objForm you cannot call a method on a null-valued expression. At C:\temp\done.ps1:22 char:1 +WindowName.Controls.Add($done) + +CategoryInfo : InvalidOperation: (:) [], RuntimeException +Fully QualifiedErrorID: InvokeMethodOnNull Das 'Hello' kommt vom 1. wrtite-Host Befehl (Da wollte ich nur schauen, ob write-Host überhaupt funktioniert) Das 'objForm' kommt vom 2. write-Host Befehl (Super! Die variable '$WindowName' wird also übergeben!!) Aber warum wird der Inhalt Variable 'WindowName' nicht auch beim nächsten befehl angewendet? Das $WindowName.Controls.Add($done) sollte eigentlich umgewandelt werden in ein ' objForm.Controls.Add($done)' - dann wäre alles super und es würde funktionieren. Aber das bekomme ich nicht hin?! Vielen Dank für jede Hilfe newbi