Jump to content

newbi2009

Members
  • Gesamte Inhalte

    19
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von newbi2009

  1. Hallo Nobby, danke für die Antwort. Naja, die Firmen-Policies lassen es einfach nicht zu, exe-Dateien selber zu kompilieren Der UNC-Pfad sollte tatsächlich bei allen Benutzern gleich sein. Dann müsste ich den "Installationspfad" aber manuell in das Skript schreiben ala: \\Server\Freigabe\Skripte Das würde mit Sicherheit auch funktionieren. Ich würde das Ganze aber gerne eleganter lösen. Z.B. für den Fall, dass das Verzeichnis "Skripte" einmal an einen anderen Ort verschoben werden sollte Mein Skript sieht in etwa so aus: function Uhr() { $Date = Get-Date $Time= $Date.toString()("yyyy-MM-dd_HH.mm.ss") $Datum= $Time.toString("yyyy-MM-dd") } $InstallPath = $PWD.ToString() Uhr $LogDateiName = "$InstallPath\Logs\$Satum\MeinSkriptname_" + $Time +".log" . . . write-output "Diese Zeile soll in die Log-Datei eingetragen werden" | Tee-Object -FilePath $LogDateiName -append Danke und Gruß Holger Hallo BOfH_666, auch Dir "danke" für Deine Antwort. Ich möchte es eigentlich vermeidenzu allen Kollegen zu latschen und einen Link auf die ps.1-Datei zu erstellen. Ausserdem bin ich mir nicht ganz sicher, ob der Link das Problem lösen würde. Es würde dann doch der Pfad des lokalen Rechners ausgelesen - also würden die Log-Dateien wieder nicht alle im gleichen Verzeichnis (Netzlaufwerk) landen..... Dass die Datei mit der PowerShell.exe ausgeführt werden sollte ist mir schon klar. Aber es wird (glaube ich) halt standardmäßig die 64bit Version ausgeführt, die gegen die Pumpe läuft, wenn man versucht damit eine LotusNotes-Anwendung auszulesen.... Und alles andere als rechter Mausklick / Ausführen mit kann ich meinen Kollegen nicht zumuten
  2. Hallo Forum, ich habe ein kleines Problem und hoffe, es gibt eine einfache Lösung hierzu: Ich habe ein Powershell-Skript geschrieben, welches ich auf einem Netzlaufwerk (nennen wir es Z:\Skripte\meinSkript.ps1) abgelegt habe. Dieses Skript schreibt Log-Dateien, die im gleichen Verzeichnis erzeugt werden sollen (Z:\Skripte\Logs) Ausserdem soll dieses Skript von allen meinen Kollegen benutzt werden können, die sich das Netzlaufwerk aber nicht alle mit "Z:\" gemappt haben. Um die Log-Datein also an dem gewünschten Ort abzulegen, muss ich den Netzwerkpfad der ps1-Datei auslesen. Jetzt gibt es ein paar Probleme: - Windows öffnet ps.1-Dateien standardmäßig mit einem Text-Editor (Doppelklick auf die Datei führt diese nicht aus) - Ich kann/darf aus der ps.1 keine exe kompilieren, die per Doppelklick ausgeführt werden könnte - mein Script MUSS in einer 32 Bit Variante von PowerShell ausgeführt werden (weil ich Lotus Notes abfrage) - Das heisst, "rechter Mausklick/öffnen mit Powershell" lässt das Skript abbrechen, weil Powershell standardmäßig in einer 64 bit Version startet Ich muss das Skript also in einer "Powershell ISE" öffnen (vor Allem meine nicht PowerShell-affinen Kollegen). Hier steht der Fokus natürlich auf C:\Windows\System32 Lese ich jetzt den Pfad mit "get-location" oder "PWD" aus, bekomme ich natürlich "C:\Windows\System32" geliefert. Dies kann ich dann natürlich nicht verwenden, um den Pfad für eine Log-Datei in dem Netzlaufwerk zu generieren. Ich kann den Kollegen auch nicht sagen, dass sie sich das Programmverzeichnis alle auf den eigenen Rechner kopieren sollen und die erzeugten Logs dann manuell auf dem Netzlaufwerk ablegen sollen. Wie bekomme ich also in der "Power Shell ISE" den Pfad in eine Variable, in der die ps1-Datei liegt? Vielen Dank für einen Tipp Gruß Holger
  3. Hallo Forum, ich kämpfe gerade mit einem Problem, das ich nicht verstehe. Vielleicht kann mich ja jemand von Euch erleuchten? Ich versuche Punkte aus einer Variable (in der eine Faxnummer gespeichert ist) zu ersetzen ich habe in einer globalen Variable eine Faxnummer mit Leerzeichen und 3 Punkten dahinter gespeichert: $global:Fax = "2261 4405 ..." jetzt versuche ich das Leerzeichen und die darauf folgenden 3 Punkte zu entfernen: if ($global:Fax -like ("* ...")) { $global:Fax_neu = $global:Fax -replace (" ...","") } Der Inhalt von $global:Fax_neu ist jetzt erstaunlicherweise: 22615 Warum? Und wie bekomme ich es hin, dass $global:Fax_neu = 2261 4405 ist? vielen Dank für Eure Hilfe Gruß Holger
  4. ....was mich dann wieder zu meiner ursprünglichen Frage führt: MUSS ich den Umweg gehen, den Inhalt der Variable zuerst in eine Datei zu speichern, nur um diese danach wieder einzulesen? Das muss doch auch ohne gehen.... Aber wie?
  5. damit ich jeden einzelnen Wert ansprechen und später in den LDAP-Server einfügen kann ...das ist ein Excl-Datei "saved as CSV"
  6. ...also dann doch so, wie ich es ganz am Anfang versucht habe => mir selber eine neue CSV-Datei aus verschiedenen Bestandteilen "zusammenstricken" und diese dann abspeichern und neu laden.
  7. Zu ladene CSV_Datei Ohne " als erstes Zeichen: Zeile 01 Zeile 02 Zeile 03 Zeile 04 Zeile 05 Schmitz;Harald;Schmitz@zuHause.de;123456; ;Heiner;;234567; Müller;;Mueller@zuHause.de;; Maier;Susanne;;456789 ;;;;;;;;;;;;;; PS C:> $abc = @(import-csv -path C:\temp\Test.csv -Header "Nachname","Vorname","Email","PersonalNummer" -Delimiter ";"| Select-Object -skip 5) PS C:> $abc Nachname Vorname Email PersonalNummer -------- ------- ----- -------------- Schmitz Harald Schmitz@zuHause.de 123456 Heiner 234567 Müller Mueller@zuHause.de Maier Susanne 456789 PS C:> $abc[1] Nachname Vorname Email PersonalNummer -------- ------- ----- -------------- Heiner 234567 PS C:> $abc[1].Vorname Heiner PS C:> Bei einer zu ladene CSV_Datei MIT " als erstes Zeichen einer beliebigen der ersten 5 Zeilen, füllt sich die Variable $abc nicht mehr: Zeile 01 "Zeile 02 Zeile 03 Zeile 04 Zeile 05 Schmitz;Harald;Schmitz@zuHause.de;123456; ;Heiner;;234567; Müller;;Mueller@zuHause.de;; Maier;Susanne;;456789 ;;;;;;;;;;;;;; PS C:> $abc = @(import-csv -path C:\temp\Test.csv -Header "Nachname","Vorname","Email","PersonalNummer" -Delimiter ";"| Select-Object -skip 5) PS C:> $abc PS C:> $abc[1] PS C:> $abc[1].Vorname PS C:>
  8. Hallo zusammen, ich habe es jetzt mit dieser Zeile hinbekommen $abc = @(import-csv -path C:\temp\Test.csv -Header 'Nachname;Vorname;Email;PersonalNummer' | Select-Object -skip 5) $abc = @(import-csv -path C:\temp\Test.csv -Header "Nachname","Vorname","Email","PersonalNummer" -delimiter ";" | Select-Object -skip 5) vielen Dank für Eure Hilfe. Allerdings habe ich noch ein Phänomen, bei dem ich bitte nochmal Eure Hilfe bräuchte: Sobald das ERSTE ZEICHEN einer Zeile in der csv-Datei, die eingelesen wird, ein Anführungszeichen " ist, funktioniert das Ganze nicht mehr?! Wie kann ich das denn "reparieren" (ich habe leider in meiner einzulesenden CSV in 2 Zeilen jeweils ein " als erstes Zeichen stehen) Danke nochmal Holger sorry, ich wollte die Code-Zeile nicht doppelt posten....
  9. ...grundsätzlich ne gute Idee, hätte ich auch selber drauf kommen können Aber so richtig funktionieren tut das auch nicht $abc = @(import-csv -path C:\temp\Test.csv -Header 'Nachname;Vorname;Email;PersonalNummer' | Select-Object -skip 5) ein $abc bringt dann auch das gewünschte Ergebnis: Nachname;Vorname;Email;PersonalNummer ------------------------------------- Schmitz;Harald;Schmitz@zuHause.de;123456; ;Heiner;;234567; Müller;;Mueller@zuHause.de;; Maier;Susanne;;456789 ;;;;;;;;;;;;;; Müller;;Mueller@zuHause.de;; auch ein $abc[2] bringt das gewünschte Ergebnis Nachname;Vorname;Email;PersonalNummer ------------------------------------- Müller;;Mueller@zuHause.de;; allerdings liefert ein $abc[2].Email kein Ergebnis ?! Was mache ich denn hier falsch?
  10. Hi Nils, ja, ich könnte auch die Excel-Datei bekommen. Das ist kein Problem. Was ich damit weiter vorhabe ist nicht ganz einfach zu erklären und da werde ich wohl auch noch lange dran sitzen, bis ich das hinbekomme. Im Endeffekt muss ich die Daten, die in der Excel geliefert werden herausfiltern und damit existierende Benutzer-Daten auf einem Oracle-LDAP-Server updaten. Sprich: Benutzer x soll ein bestimmtes Flag auf dem LDAP Server gesetzt bekommen. Das mache ich bisher alles "zu Fuß". Es kommt aber vor, dass Excel-Tabellen mit 60 oder mehr Benutzern reinkommen, bei denen manuell unterschiedliche Flags gesetzt werden müssen, oder diese in unterschiedlioche Gruppen aufgenommen werden müssen..... Das möchte ich so weit automatisieren, wie es mir möglich ist.... Lange Rede, kurzer Sinn: Es wäre mir tatsächlich schon mega geholfen, wenn Ihr mir bei meinem ursprünglichen Problem helfen könntet.... Es werden bestimmt beim Entwickeln noch genug andere Probleme auftauchen, die ich ich jetzt noch nicht absehen kann Danke und Gruß Holger
  11. Hi Nils, Ich habe immer wieder Excel-Dateien, die den gleichen Aufbau haben. Nur eben unterschiedlich mit Namen, Mail-Adresse, etc... befüllt. Diese werden mir als csv-Datei abgespeichert zur Verfügung gestellt. Hier sind halt die ersten paar Zeilen immer Datenmüll. Ich möchte die Zeilen, die die Benutzer-Informationen (in der csv immer ab Zeile 6) also weiterverarbeiten. Dazu möchte ich diese in einem mehrdimensionalen Array haben, damit ich ich für jeden Benutzer die einzelnen Daten explizit ansprechen kann (z.b. Mailadresse von Benutzer aus Zeile 7 => $ergebnis[2].Email) Quasi genau so, wie ich es habe, wenn ich den Zwischenschritt mit der zweiten csv Datei, die ich abspecihere und wieder einlese, habe. Halt nur, ohne den Umweg eine neue Datei abzulegen und wieder einzulesen.... Danke und Gruß Holger Hallo BOfH_666, danke für Deine Antwort. Das ImportExcel-Modul schaue ich mir einmal genauer an. Dankefür den Tipp! Allerdings bringt mir das cmdlet Import-Csv nicht so viel. Ich habe ja eine Variable ($xyz) in die ich meinen selbstgebauten Header und die nötigen "Daten-Zeilen" aus der ursprünglichen csv Datei gelegt habe....... Ich bekomme es aber nicht hin, diese Variable als Array zu benutzen. Ich muss zuerst den Inhalt der Variable in eine Datei abspecihern und DANN mit import-csv diese neue Datei wieder einlesen (der Inhalt der abgespeciherten csv Datei ist ja genauso, wie ich es brauche..... nur bekomme ich diesen halt nicht in ein Array) Danke und Gruß Holger
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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)
  17. 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
×
×
  • Neu erstellen...