none
Fehlerhaftes Auslesen einer Variable RRS feed

  • Frage

  • Hallo zusammen,

    und zwar verzweifel ich seit einigen Tagen an einem Script für das auslesen einer OU aus der AD.

    Hier einmal mein Script:

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

    $objForm = New-Object System.Windows.Forms.Form
    $objForm.ClientSize = New-Object System.Drawing.Size(407, 390)
    $objForm.topmost = $true

    # OU Auswahl 

    $objText1 = New-Object System.Windows.Forms.Label
    $objText1.Location = New-Object System.Drawing.Size(10,10) 
    $objText1.Size = New-Object System.Drawing.Size(280,20) 
    $objText1.Text = "Bitte OU auswählen: "
    $objForm.Controls.Add($objText1) 

    $computerNames = @(Get-ADOrganizationalUnit -Property Name  -Filter {(Name -like "NLTer*") -or (Name -like "TSI*") -or (Name -like "ZL1*") -or (Name -like "HAMM*")}  -SearchBase 'OU=Land,DC=ads,DC=Firma,DC=net' | select -Expandproperty Name)
    $comboBox1 = New-Object System.Windows.Forms.Combobox
    $comboBox1.Location = New-Object System.Drawing.Size(10, 30)
    $comboBox1.Size = New-Object System.Drawing.Size(300, 20)
    $comboBox1.sorted = $true;
    foreach($computer in $computerNames)
    {
      $comboBox1.Items.add($computer)
    }

    $objForm.Controls.Add($comboBox1)

    # OU Auswahl ende


    # Buttons für OU Auswahl 1

    $Button = New-Object System.Windows.Forms.Button
    $Button.Location = New-Object System.Drawing.Point(110, 50)
    $Button.Size = New-Object System.Drawing.Size(75, 23)
    $Button.Text = "Weiter"
    $Button.add_Click({ListBox})
    $objForm.Controls.Add($Button)

    $Button2 = New-Object System.Windows.Forms.Button
    $Button2.Location = New-Object System.Drawing.Point(191, 50)
    $Button2.Size = New-Object System.Drawing.Size(120, 23)
    $Button2.Text = "Eingabe Speichern"
    $Button2.add_Click({$objText4.Text = $comboBox1.SelectedItem.ToString()})
    $objForm.Controls.Add($Button2)


    # --------------------------------------------------------------------------



    # Abteilungs Auswahl 

    $objText2 = New-Object System.Windows.Forms.Label
    $objText2.Location = New-Object System.Drawing.Size(10,100) 
    $objText2.Size = New-Object System.Drawing.Size(280,20) 
    $objText2.Text = "Wählen Sie die NL oder Abteilung aus:"
    $objForm.Controls.Add($objText2) 


    Function ListBox
    {

    $searchou = "OU=" + $objText4.Text + ",OU=Land,DC=ads,DC=Firma,DC=net"

    $computerNames2 = @(Get-ADOrganizationalUnit -Property Name  -Filter {(Name -like "*")} -SearchBase $searchou | select -Expandproperty Name)
    $ListBoxOU = New-Object System.Windows.Forms.Combobox 
    $ListBoxOU.Location = New-Object System.Drawing.Size(10,120) 
    $ListBoxOU.Size = New-Object System.Drawing.Size(300,20) 
    $ListBoxOU.sorted = $true;

    foreach($computers2 in $computerNames2) 
    {
      $ListBoxOU.Items.add($computers2)
    }

    $objForm.Controls.Add($ListBoxOU)

    }

    # Buttons für NL Auswahl 2

    $Button3 = New-Object System.Windows.Forms.Button
    $Button3.Location = New-Object System.Drawing.Point(191, 140)
    $Button3.Size = New-Object System.Drawing.Size(120, 23)
    $Button3.Text = "Eingabe Speichern"
    $Button3.add_Click({$objText5.text = $ListBoxOU.SelectedItem.ToString()})
    $objForm.Controls.Add($Button3)

    # Button ende


    $objText4 = New-Object System.Windows.Forms.Label
    $objText4.Location = New-Object System.Drawing.Size(20,300) 
    $objText4.Size = New-Object System.Drawing.Size(200,20) 
    $objText4.Text = "1"
    $objForm.Controls.Add($objText4) 


    $objText5 = New-Object System.Windows.Forms.Label
    $objText5.Location = New-Object System.Drawing.Point(20, 320)
    $objText5.Size = New-Object System.Drawing.Size(200, 20)
    $objText5.Text = "2"
    $objForm.Controls.Add($objText5)


    [void]$objForm.showdialog()

    Komischerweise ließt er die erste Variable aus nur die zweite nicht.

    Ich hoffe mir kann jemand einen Tipp geben.

    Liebe Grüße 

    Nils

    Dienstag, 7. Juli 2015 07:21

Antworten

  • Ds liegt daran, das du $ListBoxOU innerhalb einer Funktion definierst. Du fügst diese zwar deiner Form hinzu und die Combobox selbst bleibt auch erhalten, aber sobald du die Funktion verlässt, verfällt deine Referenz, die Variable $ListboxOU wieder. (Get-Help about_scope).

    Entweder du definierst $ListBoxOU scriptweit, mit $script:ListBoxOU oder (besser!) du erstellst die Combobox dort wo du alle anderen Elemente deiner Form erstellst und versteckst sie ($ListBoxOU.visible = $false), solange du sie noch nicht sehen willst.

    Du solltest übrigens deinen Code etwas besser strukturieren, um dir (und mögl. anderen) die Fehlersuche zu erleichtern.

    • Die Formatierung ist uneinheitlich und unübersichtlich.
    • Du solltest z.b. die Formerstellung (fix) und variablen Code (befüllen der Comboboxen) nicht durcheinandermischen.
    • Alle Formelemente gehören an einen Platz,  variable Codeteile (Kalkulationen, Enumerationen, Eingaben, Ausgaben) jeweils in eine Funktion.
    • Formelemente sollten nach ihrer Funktion benannt werden. In 2 Monaten weisst auch du nicht mehr was Button2 oder Objtext3 war.
    • Und eine Combobox $Listbox zu nenen oder eine andere Variable $computerNames und die dann mit OU's zu befüllen ist schon regelrecht mutwillig. :)
       

    Ernsthaft, wenn mir sowas bei meiner Arbeit begegnete, würde ich mich weigern auch nur einen Blick drauf zu werfen.
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher 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, 8. Juli 2015 10:08
    Moderator
  • Das kommt darauf an wohin du die Variable übergeben willst. :)
    Hast du mal die Hilfe zu scopes gelesen, wie ich bereits vorschlug? (googlen oder Get-Help about_scope eintippen) Das ist absolut wichtiges Basiswissen. Ernsthaft.

    Allgmein kannst du z.b. deine Werte in der Funktion in eine scriptweite Variable übergeben ($script:Variablenname ) diese ist dann überall im Script verfügbar. Oder du kannst auch das Ergebnis einer Funktion einer Variable zuweisen. Also die Funktion so aufrufen:

    Function Myfunction () {
    	$test = "Text1234"
    	return $test
    }
    
    $ergebnis = Myfunction
     

    Hier musst du aber aufpassen, da jeglicher Output innerhalb der Funktion hinterher in der Variablen landet, nicht nur was hinter Return steht. (Also gut testen)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher 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.


    Freitag, 10. Juli 2015 23:49
    Moderator

Alle Antworten

  • Hi Nils,

    es wäre wesentlich einfacher, wenn Du uns sagst, auf welche zwei Variablen Du Dich beziehst. Generell enthält das Skript extrem viele Variablen und keiner möchte lang danach suchen, was Du meinst... ;-)


    Gruß

    Ben

    MCSA Windows 8 (.1) MCSA Windows Server 2012 (R2)

    Wenn Dir meine Antwort hilft, markiere sie bitte entsprechend als Antwort! Danke! :-)

    Hinweis: Meine Posts werden "wie besehen" ohne jedwede Gewähr bereitgestellt, da menschliche, technische und andere Fehler nicht ausgeschlossen werden können.

    Dienstag, 7. Juli 2015 08:07
  • Klar :)

    es geht um das auslesen der Variablen $comboBox1 und $ListBoxOU.

    Die Variable $comboBox1 wird in $objText4 ausgegeben mit erfolg und $ListBoxOU sollte in $objText5 ausgegeben werden, jedoch bekomme ich da die Meldung das der wert NULL wäre...


    Mittwoch, 8. Juli 2015 09:00
  • Ds liegt daran, das du $ListBoxOU innerhalb einer Funktion definierst. Du fügst diese zwar deiner Form hinzu und die Combobox selbst bleibt auch erhalten, aber sobald du die Funktion verlässt, verfällt deine Referenz, die Variable $ListboxOU wieder. (Get-Help about_scope).

    Entweder du definierst $ListBoxOU scriptweit, mit $script:ListBoxOU oder (besser!) du erstellst die Combobox dort wo du alle anderen Elemente deiner Form erstellst und versteckst sie ($ListBoxOU.visible = $false), solange du sie noch nicht sehen willst.

    Du solltest übrigens deinen Code etwas besser strukturieren, um dir (und mögl. anderen) die Fehlersuche zu erleichtern.

    • Die Formatierung ist uneinheitlich und unübersichtlich.
    • Du solltest z.b. die Formerstellung (fix) und variablen Code (befüllen der Comboboxen) nicht durcheinandermischen.
    • Alle Formelemente gehören an einen Platz,  variable Codeteile (Kalkulationen, Enumerationen, Eingaben, Ausgaben) jeweils in eine Funktion.
    • Formelemente sollten nach ihrer Funktion benannt werden. In 2 Monaten weisst auch du nicht mehr was Button2 oder Objtext3 war.
    • Und eine Combobox $Listbox zu nenen oder eine andere Variable $computerNames und die dann mit OU's zu befüllen ist schon regelrecht mutwillig. :)
       

    Ernsthaft, wenn mir sowas bei meiner Arbeit begegnete, würde ich mich weigern auch nur einen Blick drauf zu werfen.
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher 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, 8. Juli 2015 10:08
    Moderator
  • Danke für die Hilfe ! 

    Ja an deinem Verbesserungsvorschlag ist was dran ;-) !

    Ich werde es dann mal ohne die Funktion ausprobieren und mich nochmal melden !

    Besten Dank!

    Mittwoch, 8. Juli 2015 10:34
  • Ich hätte da doch noch einmal eine Frage.. 

    Und zwar habe ich jetzt die Funktion raus genommen und somit klappt es auch, nur jetzt wird natürlich im voraus schon nach einer OU gesucht..

    Ich hab hier nochmal das Script versucht besser zu ordnen:

     [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")



    $objForm = New-Object System.Windows.Forms.Form
    $objForm.ClientSize = New-Object System.Drawing.Size(407, 390)
    $objForm.topmost = $true


    # ---- Text OU Auswahl ----

    $Text_OU_Auswahl = New-Object System.Windows.Forms.Label
    $Text_OU_Auswahl.Location = New-Object System.Drawing.Size(10,10) 
    $Text_OU_Auswahl.Size = New-Object System.Drawing.Size(280,20) 
    $Text_OU_Auswahl.Text = "Bitte OU auswählen: "
    $objForm.Controls.Add($Text_OU_Auswahl) 


    # ---- Auswahl Box OU ----

    $Filter_OU_Auswahl = @(Get-ADOrganizationalUnit -Property Name  -Filter {(Name -like "NLTer*") -or (Name -like "TSI*") -or (Name -like "ZL1*") -or (Name -like "HAMM*")}  -SearchBase 'OU=Land,DC=ads,DC=Firma,DC=net' | select -Expandproperty Name)
    $Liste_OU = New-Object System.Windows.Forms.Combobox
    $Liste_OU.Location = New-Object System.Drawing.Size(10, 30)
    $Liste_OU.Size = New-Object System.Drawing.Size(300, 20)
    $Liste_OU.sorted = $true;
    foreach($Filter_OU in $Filter_OU_Auswahl)
    {
      $Liste_OU.Items.add($Filter_OU)
    }

    $objForm.Controls.Add($Liste_OU)


    # ---- Buttons für OU Auswahl ----

    #$Button_Laden_NL = New-Object System.Windows.Forms.Button
    #$Button_Laden_NL.Location = New-Object System.Drawing.Point(110, 50)
    #$Button_Laden_NL.Size = New-Object System.Drawing.Size(75, 23)
    #$Button_Laden_NL.Text = "Weiter"
    #$Button_Laden_NL.add_Click({ListBox})
    #$objForm.Controls.Add($Button_Laden_NL)

    $Button_OU_Speichern = New-Object System.Windows.Forms.Button
    $Button_OU_Speichern.Location = New-Object System.Drawing.Point(191, 50)
    $Button_OU_Speichern.Size = New-Object System.Drawing.Size(120, 23)
    $Button_OU_Speichern.Text = "Eingabe Speichern"
    $Button_OU_Speichern.add_Click({$Ausgabe_OU.Text = $Liste_OU.SelectedItem.ToString()})
    $objForm.Controls.Add($Button_OU_Speichern)


    # ---- Text NL Auswahl -----

    $Text_NL_Auswahl = New-Object System.Windows.Forms.Label
    $Text_NL_Auswahl.Location = New-Object System.Drawing.Size(10,100) 
    $Text_NL_Auswahl.Size = New-Object System.Drawing.Size(280,20) 
    $Text_NL_Auswahl.Text = "Wählen Sie die NL oder Abteilung aus:"
    $objForm.Controls.Add($Text_NL_Auswahl) 


    # ---- Definition des Pfades aus OU-Auswahl ----

    $Neue_SearchBase_NL = "OU=" + $Ausgabe_OU .Text + ",OU=Land,DC=ads,DC=Firma,DC=net"


    # ---- Auswahlbox Niederlassung ----


    $Filter_NL_Auswahl = @(Get-ADOrganizationalUnit -Property Name  -Filter {(Name -like "*")} -SearchBase $Neue_SearchBase_NL | select -Expandproperty Name)
    $Liste_NL = New-Object System.Windows.Forms.Combobox 
    $Liste_NL.Location = New-Object System.Drawing.Size(10,120) 
    $Liste_NL.Size = New-Object System.Drawing.Size(300,20) 
    $Liste_NL.sorted = $true;

    foreach($Filter_NL in $Filter_NL_Auswahl)
    {
      $Liste_NL.Items.add($Filter_NL)
    }

    $objForm.Controls.Add($Liste_NL)


    # ---- Button für NL Auswahl ----

    $Button_NL_Speichern = New-Object System.Windows.Forms.Button
    $Button_NL_Speichern.Location = New-Object System.Drawing.Point(191, 140)
    $Button_NL_Speichern.Size = New-Object System.Drawing.Size(120, 23)
    $Button_NL_Speichern.Text = "Eingabe Speichern"
    $Button_NL_Speichern.add_Click({$Ausgabe_NL.text = $Liste_NL.SelectedItem.ToString()})
    $objForm.Controls.Add($Button_NL_Speichern)


    # ---- Ausgabe der OU und Niederlassung ----

    $Ausgabe_OU = New-Object System.Windows.Forms.Label
    $Ausgabe_OU.Location = New-Object System.Drawing.Size(20,300) 
    $Ausgabe_OU.Size = New-Object System.Drawing.Size(200,20) 
    $Ausgabe_OU.Text = "1"
    $objForm.Controls.Add($Ausgabe_OU) 


    $Ausgabe_NL = New-Object System.Windows.Forms.Label
    $Ausgabe_NL.Location = New-Object System.Drawing.Point(20, 320)
    $Ausgabe_NL.Size = New-Object System.Drawing.Size(200, 20)
    $Ausgabe_NL.Text = "2"
    $objForm.Controls.Add($Ausgabe_NL)


    [void]$objForm.showdialog()
    • Bearbeitet Nils.BK Mittwoch, 8. Juli 2015 10:54
    Mittwoch, 8. Juli 2015 10:49
    • Du solltest z.b. die Formerstellung (fix) und variablen Code (befüllen der Comboboxen) nicht durcheinandermischen.
    • Alle Formelemente gehören an einen Platz,  variable Codeteile (Kalkulationen, Enumerationen, Eingaben, Ausgaben) jeweils in eine Funktion.

    :)


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher 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, 8. Juli 2015 11:21
    Moderator
  • Das hab ich soweit getan:) 

    Nur jetzt wäre da noch die Sache wie es möglich ist eine Variable aus einer Funktion aus zu übergeben?

    LG

    Nils

    Donnerstag, 9. Juli 2015 09:12
  • Das kommt darauf an wohin du die Variable übergeben willst. :)
    Hast du mal die Hilfe zu scopes gelesen, wie ich bereits vorschlug? (googlen oder Get-Help about_scope eintippen) Das ist absolut wichtiges Basiswissen. Ernsthaft.

    Allgmein kannst du z.b. deine Werte in der Funktion in eine scriptweite Variable übergeben ($script:Variablenname ) diese ist dann überall im Script verfügbar. Oder du kannst auch das Ergebnis einer Funktion einer Variable zuweisen. Also die Funktion so aufrufen:

    Function Myfunction () {
    	$test = "Text1234"
    	return $test
    }
    
    $ergebnis = Myfunction
     

    Hier musst du aber aufpassen, da jeglicher Output innerhalb der Funktion hinterher in der Variablen landet, nicht nur was hinter Return steht. (Also gut testen)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher 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.


    Freitag, 10. Juli 2015 23:49
    Moderator