none
Import-Module in ForEach

    Frage

  • Ich möchte zwei Module in einem Script durch eine ForEach Schleife auf ihren Status prüfen und ggf. importieren. Leider bekomme ich das nicht hin.


    Vereinfach sieht das so aus:

    $Modules = "ActiveDirectory", "DFSR"
    
    If ( ! (Get-Module -Name $Modules)) 
            {
                Import-Module -Name $Modules
            }

    Das funktioniert einwandfrei. Jetzt möchte ich aber für jedes geladene Modul eine Fehler/Erfolgsmeldung haben.

    Dann habe ich das geschrieben:

    $Modules = "ActiveDirectory", "DFSR"
    
    
    ForEach ($Module in $Modules){
    
      If ( ! (Get-Module -Name $_ )) 
      {
        If (!$Error) {Import-Module -Name $_}{Write-Output -InputObject "Fehler das $_ Modul zu laden"}
      }
    }

    Fehlermeldung:

    Get-Module : Das Argument für den Parameter "Name" kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL oder leer ist, und führen Sie den
    Befehl erneut aus.


    Get-Help Import-Module -Parameter Name

    Liefert folgendes Ergebnis:


    -Name <String[]>

        Erforderlich?                true
        Position?                    0
        Standardwert                 None
        Pipelineeingaben akzeptieren?True (ByValue)
        Platzhalterzeichen akzeptieren?false


    $Modules.GetType()

    IsPublic    IsSerial    Name     BaseType                                                                                                                           
    --------    --------     ----        --------                                                                                                                           
    True        True        Object[]   System.Array

    $Module.GetType()

    IsPublic IsSerial Name   BaseType                                                                                                                           
    -------- --------  ----      --------                                                                                                                           
    True      True     String   System.Object

    Passt doch alles, was übersehe ich?

    Dienstag, 12. Juni 2018 07:41

Antworten

  • Hallo,

    Du greifts falsch auf den Modulnamen innerhalb des foreach zu.

    Das geht entweder so:

    ForEach ($Module in $Modules){
    
      If ( ! (Get-Module -Name $Module )) 
      {
        If (!$Error) {Import-Module -Name $Module}{Write-Output -InputObject "Fehler das $Module Modul zu laden"}
      }
    }

    oder so:

    $Modules | foreach {
    
      If ( ! (Get-Module -Name $_ )) 
      {
        If (!$Error) {Import-Module -Name $_}{Write-Output -InputObject "Fehler das $_ Modul zu laden"}
      }
    }
    Klappt das nun?

    • Als Antwort markiert LeinesDyce Dienstag, 12. Juni 2018 08:05
    Dienstag, 12. Juni 2018 07:47

Alle Antworten

  • Hallo,

    Du greifts falsch auf den Modulnamen innerhalb des foreach zu.

    Das geht entweder so:

    ForEach ($Module in $Modules){
    
      If ( ! (Get-Module -Name $Module )) 
      {
        If (!$Error) {Import-Module -Name $Module}{Write-Output -InputObject "Fehler das $Module Modul zu laden"}
      }
    }

    oder so:

    $Modules | foreach {
    
      If ( ! (Get-Module -Name $_ )) 
      {
        If (!$Error) {Import-Module -Name $_}{Write-Output -InputObject "Fehler das $_ Modul zu laden"}
      }
    }
    Klappt das nun?

    • Als Antwort markiert LeinesDyce Dienstag, 12. Juni 2018 08:05
    Dienstag, 12. Juni 2018 07:47
  • $_ ist eine automatische Variable bei Pipe.
    Im ForEach gibst du deine Laufvariable $Module doch an, somit musst du diese auch beim Get-Module angeben.

    Fehler fängt man mittels Try/Catch ab.

    https://www.windowspro.de/script/fehlerbehandlung-powershell-erroraction-try-catch-finally

    Dienstag, 12. Juni 2018 07:49
  • Ja klar! Die Variable ist dort ja nicht bekannt. Danke :)
    Dienstag, 12. Juni 2018 08:06
  • Eine aktuelle Version von Powershell vorausgesetzt, kannst Du Dir das Leben viel leichter machen, wenn Du statt der aufwändigen Schleifenkonstruktion an den Anfang Deines Scriptes ein #Requires - Statement stellst.

    In Deinem Fall also so:

    #Requires -Modules 'ActiveDirectory', 'DFSR'
    Der Import von Modulen wird ja seit Version 3 auch schon automatisch für Dich durchgeführt - also eigentlich kein Grund, das noch   explizit im Code manuell zu erledigen.



    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Dienstag, 12. Juni 2018 13:44
    Dienstag, 12. Juni 2018 10:54
  • > eigentlich kein Grund, das noch explizit im Code manuell zu erledigen.

    "Uneigentlich" liegen meine Module gerne mal nicht im $PSModulePath :-))

    Dienstag, 12. Juni 2018 11:23
  • Martin, Martin, Martin ... darf ich davon ausgehen, dass das dann aber von Dir selbst entwickelte Module sind?  ... oder installierst Du "Standard"-Module auch in andere Verzeichnisse?  :-P  ... ich könnte mir vorstellen, dass das für den OP nicht so dolle relevant ist.  ;-) :-D

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 12. Juni 2018 13:47