Jump to content

newbi2009

Members
  • Gesamte Inhalte

    19
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von newbi2009

  1. vor 44 Minuten schrieb Sunny61:

    Zum Thema Pfad des Scriptes auslesen findest Du hier ein Beispiel: https://www.itnator.net/psscriptroot-beinhaltet-pfad-des-powershell-scripts/

    Bau dir das mal in dein Script an der richtigen Stelle ein und lass dir mit write-host $PSScriptRoot den Pfad ausgeben. Wenn es der richtige ist, dann geht es weiter.

     

    Verknüpfungen legt man nicht manuell an, sondern lässt sie per GPO bei den betroffenen Usern *aktualisieren*, dann passt der Aufruf. ;)

    THIS did the trick  :thumb1:

    Vielen Dank!!

  2. 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 :-)

  3. 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

     

     

     

     

     

     

     

     

     

     

  4. vor 4 Minuten schrieb BOfH_666:

    Punkte sind, wenn es um regex geht "spezielle Zeichen". Der Punkt steht für ein beliebiges Zeichen. Wenn Du also wirklich einen Punkt ersetzen willst, musst Du ihn "Escapen". 

     

    Im einfachsten Fall so ... 

    "2261 4405 ..." -replace '\s\.\.\.'

     

    Das Escape-Zeichen ist der Backslash "\" und das "\s" steh hier für ein "White-Space" - also ein Leerzeichen oder ein Tab .... 

    VIELEN DANK!!

  5. 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

     

  6. vor 6 Minuten schrieb NilsK:

    Moin,

     

    was uns zum Anfang zurückführt ... lässt sich der Umweg über CSV, vielleicht sogar der über Excel vermeiden? Falls nicht, dann ist es vielleicht wirklich am einfachsten, die Importdatei erst zu korrigieren und dann zu verarbeiten.

     

    Gruß, Nils

     

    ....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?

  7. vor 34 Minuten schrieb Sunny61:

    Und was genau heißt funktioniert das Ganze nicht mehr?

    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. vor 18 Minuten schrieb BOfH_666:

     

    OK.... also prinzipiell bin ich absolut bei Nils. Wir haben hier schon öfters an Lösung von hinten durch die Brust ins Auge gebaut, die aber für die eigentlich zu lösende Aufgabe völlig unnötig waren.

     

    Davon unabhängig:

     

    Du kannst Dir doch das ganze Geraffel sparen, wenn Du die aus Deiner Excel-Datei erzeugte CSV-Datei, die ja keine Header hat, ganz normal mit Import-CSV einliest, dabei mit dem Parameter -Header, die gewünschten Header dazupackst und mit einem Select-Object -Skip 5, die ersten 5 Zeilen auslässt.

    ...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. vor 10 Minuten schrieb NilsK:

    Moin,

     

    aha, es handelt sich also um eine wiederkehrende Aufgabe mit wechselnden Daten? Was geschieht damit, d.h. in welcher Art verarbeitest du das weiter?

    Bekommst du die CSVs direkt oder erzeugst du die selbst? Falls du die CSVs bekommst, könntest du auch die Excels direkt erhalten?

     

    Hintergrund der Fragen: Wenn wir wissen, welche Aufgabe du eigentlich lösen musst, können wir dir vielleicht besser helfen. Wir erleben immer wieder, dass wir ein Detailproblem mit jemandem lösen und hinterher feststellen, dass es viel leichter wäre, die tatsächliche Aufgabe ganz anders anzugehen.

     

    Gruß, Nils

     

    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. vor einer Stunde schrieb NilsK:

    Moin,

     

    stellen wir das Ganze doch mal auf die Füße: Was hast du denn insgesamt vor? 

     

    Gruß, Nils

     

    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

     

    vor 52 Minuten schrieb BOfH_666:

    Es gibt ein Modul, mit dem Du Excel-Dateien direkt verarbeiten kannst: ImportExcel. Das macht die Sache eventuell leichter.

     

    Dafür gibt es beim cmdlet Import-Csv den Parameter -Header, mit dem man eigene Header hinzufügen kann.

     

    Ja ... quasi oben alles beantwortet ...   ;-)

     

    Ach übrigens, wenn Du Code postest, diesen am Besten auch als Code formatieren (das ist der Button "</>" oben im Editor) 

    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. vor 8 Stunden schrieb NilsK:

    Moin,

     

    du hast gesehen, dass dies ein deutschsprachiges Forum ist?

     

    Zu deiner Frage: Wenn deine Codefragmente zutreffen, dann hast du in die Variable $WindowName den String "objForm" geschrieben. Diesen String kannst du natürlich in der Funktion auch wieder ausgeben. Da es aber nun mal kein Objekt ist, gibt es auch keine Methoden.

     

    Gruß, Nils

     

    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...