IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

comment faire appelle a une Fonction Powershel


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 817
    Billets dans le blog
    2
    Par défaut comment faire appelle a une Fonction Powershel
    bonjour a tous

    j'aurai besoin de faire appeler une fonction qui me fait liste de toutes mes bases existant dans mon instance

    Pour cela j'ai crée cette fonction dans un fichier nommé Script.psm1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function Get-DBList ($server)
    {
        $srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
        $srv.Databases | Select name, RecoveryModel, 
            @{Label="CompatibilityLevel";Expression={($_.CompatibilityLevel).ToString().Replace("Version", "")}}
    } #end Get-DBList
    SI j'ai essayer de faire charger cette function en faisant appelant mon fichier "Script.psm1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cd c:
    import-module  .\Backup\script 
    Get-DBList
    je viens d'avoir cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import-module : Le module «.\Backup\script.psm1» spécifié n'a pas été chargé, car aucun fichier de module valide n'a 
    été trouvé dans un répertoire de module.
    Au caractère Ligne:1 : 1
    + import-module .\Backup\script.psm1
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ResourceUnavailable: (.\Backup\script.psm1:String) [Import-Module], FileNotFoundExcept 
       ion
        + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
    Images attachées Images attachées  

  2. #2
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    salut,

    les modules en PS n'ont pas l'extension ps1

    voici un petit exemple de comment utiliser un module:

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # Création d'un répertoire de test
    PS C:\Users\walid> md .\Desktop\Backup
     
     
        Répertoire*: C:\Users\walid\Desktop
     
     
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    d-----        2/25/2018   4:42 AM                Backup
     
    # Création d'un module ./desktop/Backup/script.psm1 contenant une fonction "demo" 
    PS C:\Users\walid> @'
    function demo {
         "Salem"
    }
    '@ > ./desktop/Backup/script.psm1
     
     
    # importation du module
    PS C:\Users\walid>Import-Module .\Desktop\Backup\script.psm1
     
    # test de la fonction 
    PS C:\Users\walid> demo
    Salem

  3. #3
    Membre émérite

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 817
    Billets dans le blog
    2
    Par défaut
    merci bien

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    De passage pour info, l'extension .psm1 est une convention qu'il est en effet préférable d'appliquer pour plus de clarté.

    Pour autant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Import-Module .\Desktop\Backup\script.ps1
    est totalement opérationnel

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par cerede2000 Voir le message
    De passage pour info, l'extension .psm1 est une convention qu'il est en effet préférable d'appliquer pour plus de clarté.
    Si c'est une convention le comportement est loin d'être identique.
    Par défaut un module exporte toutes les fonctions, pas ici :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $m=ipmo c:\temp\script.ps1 -pass
    $m
    # 
    # ModuleType Version    Name                                ExportedCommands
    # ---------- -------    ----                                ----------------
    # Script     0.0        script
     
    dir function:\demo|select mo*
    # ModuleName Module
    # ---------- ------
    Utilisons la structure de 'répertoire de module' :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [STA] C:\temp> md Script
    cd Script
    @'
    function demo {
     "Salem"
     }
    '@ > .\script.ps1
    cd ..
    $env:PSModulePath +=';c:\temp'
    ipmo script
    ipmo : The specified module 'script' was not loaded because no valid module file was found in any module directory.
    Ceci ne fonctionne pas avec un fichier .ps1, mais avec un .psm1 :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    cd .\Script\
    ren script.ps1 script.psm1
    cd ..
    ipmo script
    #ok
    dir function:\demo|select mo*
    # 
    # ModuleName Module
    # ---------- ------
    # script     script
    Notre fonction est bien liée au module.
    Si on ajoute un appel à "export-modulemember -function Demo" dans le .ps1, l'import ne fonctionne plus :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ipmo .\script.ps1
    #export-modulemember : The Export-ModuleMember cmdlet can only be called from inside a module.
    Powershell ne considére donc pas ce fichier comme un module.
    Utilisons -verbose :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ipmo .\script.ps1 -verbose
    # VERBOSE: Loading module from path 'C:\script.ps1'.
    # VERBOSE: Dot-sourcing the script file 'C:\script.ps1'.
    Il charge le script en dot sourcing et remove-module ne supprime pas les fonctions crées lors de l'import
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    demo
    #Salem
    remove-module script
    demo
    #Salem
    ipmo .\script.psm1 -verbose
    # VERBOSE: Loading module from path 'C:\temp\script.psm1'.
    # VERBOSE: Exporting function 'demo'.
    # VERBOSE: Importing function 'demo'.
    Citation Envoyé par cerede2000 Voir le message
    Pour autant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Import-Module .\Desktop\Backup\script.ps1
    est totalement opérationnel
    J'en doute, qu'il charge le fichier certainement, mais de là à dire que c'est un module opérationnel, seule l'équipe Powershell pourrait nous le confirmer.

  6. #6
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Salut,

    en complément de la réponse de Laurent je vais ajouter deux exemple qui montrent que le comportement est totalement différent

    avec deux fichiers script.ps1 et script.psm1 contenant la même chose à savoir:

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $a = 'Salem'
    function demo {
      $a
    }
    new-alias de demo

    si on l'exeute:

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    PS C:\Users\walid\Desktop> Import-Module .\script.ps1
    PS C:\Users\walid\Desktop> Get-Command -Module script
    PS C:\Users\walid\Desktop> demo
    Salem
    PS C:\Users\walid\Desktop> $a
    Salem
    PS C:\Users\walid\Desktop> de
    Salem
    PS C:\Users\walid\Desktop> Remove-Module script
    PS C:\Users\walid\Desktop> demo
    Salem
    PS C:\Users\walid\Desktop> $a
    Salem
    PS C:\Users\walid\Desktop> de
    Salem
    PS C:\Users\walid\Desktop> ri function:demo, variable:a, alias:de
    PS C:\Users\walid\Desktop>
    PS C:\Users\walid\Desktop>
    PS C:\Users\walid\Desktop> Import-Module .\script.psm1
    PS C:\Users\walid\Desktop> Get-Command -Module script
    
    CommandType     Name                                               Version    Source
    -----------     ----                                               -------    ------
    Function        demo                                               0.0        script
    
    
    PS C:\Users\walid\Desktop> $a
    PS C:\Users\walid\Desktop> de
    Salem
    PS C:\Users\walid\Desktop> Remove-Module script
    PS C:\Users\walid\Desktop> demo
    demo : Le terme «demo» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de
    script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe,
    vérifiez que le chemin d'accès est correct et réessayez.
    Au caractère Ligne:1 : 1
    + demo
    + ~~~~
        + CategoryInfo          : ObjectNotFound: (demo:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    
    PS C:\Users\walid\Desktop> de
    de : Le terme «de» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script
    ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez
    que le chemin d'accès est correct et réessayez.
    Au caractère Ligne:1 : 1
    + de
    + ~~
        + CategoryInfo          : ObjectNotFound: (de:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    
    PS C:\Users\walid\Desktop>

    on constate que tous les élements de script.ps1 sont chargé au contraire de script.psm1


    aussi il faut savoir que l'execution de import-module script.ps1 peux être dangereuse car on peux exceuter du code au chargement:

    avec deuxc fichiers foo.ps1 et foo.psm1 contenant

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    iex '"Salem"'

    voici le resultat:

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PS C:\Users\walid\Desktop> Import-Module .\foo.psm1
    PS C:\Users\walid\Desktop> Get-Module foo | Remove-Module
    PS C:\Users\walid\Desktop> Import-Module .\foo.ps1
    Salem

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Tout à fait d'accord sur ce qui est dit, mais la question de base de ce post concernait l'appel d'une fonction.

    Et à mon sens le dot sourcing est approprié dans ce cas, le module étant pour moi réservé à une autre utilisation.
    Je veux faire un DAL en Posh alors la oui le module est le bon choix et je vais créé un psm1 qui aura son manifest psd1 pour que les choses soient propres

    Ce n'est que ma vision des choses

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    J'ai posé la question sur GitHub, PS Core ayant le même comportement, la réponse de Bruce Payette
    Le script est chargé en dotsource mais n'a rien à voir avec le module créé.

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Merci Laurent pour ce complément, réponse intéressante sur la mécanique interne
    En passant ScriptsToProcess est un mécanisme intéressant que je ne connaissais pas

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    En passant ScriptsToProcess est un mécanisme intéressant que je ne connaissais pas
    Tu peux lire ce tutoriel qui l'utilise pour résoudre un problème de portée de scriptblock entre une session et un module.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/07/2014, 14h54
  2. [PrestaShop] faire appel a une fonction
    Par T4GAD4 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 14/02/2013, 17h33
  3. Comment faire appel a deux fonctions
    Par Tiny Buster dans le forum Langage
    Réponses: 2
    Dernier message: 21/08/2008, 09h21
  4. comment faire appel d'une application java dans un script shell?
    Par moradbe dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 01/02/2007, 19h55
  5. Réponses: 4
    Dernier message: 26/01/2005, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo