none
Variable aus Funktion übergeben RRS feed

  • Frage

  • Hallo,

    ich habe dieses kleine Script:

    function checkADGroups([string]$Computername, [string]$_Netz_DNS){
        $_ = Get-ADComputer -Identity $Computername -Properties *
        $_ = $_.MemberOf
        $_ = $_ -replace "\,[^\.]*$"
        $_ = $_ -replace "(?<=\.)0+"
        $_ = $_ -replace "(?<=\.)0+"
        $_ = $_.Substring(3)
        Foreach ($Gruppe in $_) {
                If($Gruppe -eq $_Netz_DNS){
                    $global:Netz_OK = "1"
                    $global:Netz_AD = $Gruppe
                    Break}
                Else {$global:Netz_OK = 2}}}
    
    $Netz_OK = $Null
    $Netz_AD = $Null
    $Gruppe = $Null
    
    
    cls
    checkADGroups PC160001 192.168.112
    
    $Netz_OK
    $Netz_AD
    $Gruppe

    starte ich das Script über Powershell ISE, dann funktioniert alles prima.

    Starte ich das Script via RunAs Test001.ps1, so wird die Variable nicht aus der Funktion übergeben. Woran kann das liegen?

    Liebe Grüße

    Norbert


    IT Berater

    Mittwoch, 24. Februar 2016 12:36

Antworten

  • Hallo,

    es gibt Dinge, die tut man einfach nicht. Und $_ einen Wert zuzuweisen gehört definitiv dazu.

    Ansonsten würde ich eher dazu raten, die Variablen über "return" zurückzugeben und über eine Wertzuweisung zu übernehmen. Also etwa so:

    function test { param($zahl) $a = $zahl * 3 $b = $zahl * 4 return $a, $b } $ErgebnisA, $ErgebnisB = test 5

    Mittwoch, 24. Februar 2016 14:08
  • Schau mal, ob das besser funktioniert:

         param
         (
             [string]
             $Computername,
    
             [string]
             $compNetzDNS
         )
    
        $ADG = (Get-ADComputer $Computername -Properties MemberOf | ForEach-Object{$_.MemberOf | %{Get-AdObject $_ }} | Select-Object Name).Name
        Foreach ($Gruppe in $ADG) {
            If($Gruppe -eq $compNetzDNS){
                $Netz_OK = '1'
                $Netz_AD = $Gruppe
                Write-Output "$Netz_OK,$Netz_AD"
                Break
            }
            Else {
                $Netz_OK = 2
                $Netz_AD = $Gruppe
                Write-Output "$Netz_OK,$Netz_AD"
            }
        }

    Aufrufen mit

    .\test.ps1 -Computername PC160001 -compNetzDNS 192.168.112

    Mittwoch, 24. Februar 2016 16:17

Alle Antworten

  • Hallo,

    hat vermutlich nicht direkt was mit deinem Problem zu tun aber ich glaube es ist keine so gute Idee Variablen $_ die von der PowerShell erstellt und gepflegt werden, also intern verwendet werden dazu zu benutzen um eigene Werte zu speichern, das koennte zu Quereffekten fuehren ...

     get-help about_Automatic_Variables

    Beste Gruesse
    brima

    Mittwoch, 24. Februar 2016 13:14
  • Hallo,

    es gibt Dinge, die tut man einfach nicht. Und $_ einen Wert zuzuweisen gehört definitiv dazu.

    Ansonsten würde ich eher dazu raten, die Variablen über "return" zurückzugeben und über eine Wertzuweisung zu übernehmen. Also etwa so:

    function test { param($zahl) $a = $zahl * 3 $b = $zahl * 4 return $a, $b } $ErgebnisA, $ErgebnisB = test 5

    Mittwoch, 24. Februar 2016 14:08
  • Hallo, danke für die Info.

    Wenn ich mein Script mit "return" anpasse, dann funktioniert es auch unter ISE nicht mehr, leider. 


    IT Berater

    Mittwoch, 24. Februar 2016 14:22
  • Schau mal, ob das besser funktioniert:

         param
         (
             [string]
             $Computername,
    
             [string]
             $compNetzDNS
         )
    
        $ADG = (Get-ADComputer $Computername -Properties MemberOf | ForEach-Object{$_.MemberOf | %{Get-AdObject $_ }} | Select-Object Name).Name
        Foreach ($Gruppe in $ADG) {
            If($Gruppe -eq $compNetzDNS){
                $Netz_OK = '1'
                $Netz_AD = $Gruppe
                Write-Output "$Netz_OK,$Netz_AD"
                Break
            }
            Else {
                $Netz_OK = 2
                $Netz_AD = $Gruppe
                Write-Output "$Netz_OK,$Netz_AD"
            }
        }

    Aufrufen mit

    .\test.ps1 -Computername PC160001 -compNetzDNS 192.168.112

    Mittwoch, 24. Februar 2016 16:17
  • Hallo,

    man könnte nun natürlich bösartig sein und sagen: Wenn du es mit return angepasst hast und es funktioniert auch in der ISE nicht mehr, dann hast du es wahrscheinlich falsch angepasst...

    Viele Grüße

    Christoph

    Donnerstag, 25. Februar 2016 07:51