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 :

Intégrer une fonction dans chaque script


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut Intégrer une fonction dans chaque script
    Bonjour alors voilà je m'explique j'ai ce début de code dans tout mes scripts

    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
    $printlog1 ="\\s.....\d$\opcon\logs\printlog1.txt"
     
    $CurrentScript = "$PSCommandPath".Substring($PSScriptRoot.Length+1) 
    $CS = $CurrentScript.PadRight(20)
     
    $CST = $CS + " " + (get-date -Format G) + " " + $MSGLOG01
     
     
    Function Add-PrintLog
        (
        [PARAMETER(Mandatory=$true, HelpMessage='My First Argument')][string]$MSGLOG01
        )
        {
     
    $CST = (get-date -Format G) + "  " + $CS + " " + $MSGLOG01
    Write-host $MSGLOG01 -ForegroundColor black -BackgroundColor darkgray
    Add-Content $printlog1 $CST
        }

    Celui-ci me permet d’intégrer dans une log tout les éléments que je désire avec la commande

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
     Add-PrintLog -MSGLOG01

    et ceci pour tous mes scripts (tout va dans la même LOG exigence de la direction).

    Je voudrai en faire une fonction ou un module pour que je n'ai pas à le mettre a chaque début de mes scripts.
    Pourriez-vous m'aider?

    Merci d'avance,

  2. #2
    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,
    tu peux copier tout ton code dans un fichier .pms1 et puis faire un import-module dans chaque script (modifier chaque script).
    Ou charger le module AVANT d'appeler le moindre script (le chargement du module étant une sorte d'initialisation du contexte) puis utiliser simplement Add-PrintLog.

    Premier soucis, ton module est lié à ton traitement (path du log), pas grave pour changer le chemin pour d'autres traitement on crée un autre module qui fait la même chose mais avec un autre nom ( je déconne ).
    L'autre déjà plus gênant est de connaitre l'appelant (le nom du producteur du log) soit tu le passes à chaque appel soit tu lis la pile d'appel (get-pscallstack).
    En passant comme on ne connait pas les usages, le write-host peut poser pb dans certains contexte d'exécution, ensuite si tu utilises ton traitement sur un serveur Citrix le nom de ton fichier sera identique pour chaque session

    Je ne pense pas que ma réponse t'aidera, perso j'utilise ceci quand je le peux, il en existe d'autres sur Github.

    Et je ne comprend pas ceci :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $CST = $CS + " " + (get-date -Format G) + " " + $MSGLOG01
    Car $MSGLOG01 est déclaré comme paramètre de ta fonction.

  3. #3
    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 JulesP Voir le message
    j'ai ce début de code dans tout mes scripts
    Tu peux aussi utiliser le dotsource pour charger un script externe et ainsi ne pas recopier le code. Mais là ceci dépend de la structure de tes répertories de scripts.

  4. #4
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut
    Merci pour ces réponses, maintenant un petit tuto pour la création d'un module, parce que la je suis un peu perdu....

  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
    Un tuto, rédigé avec la version 2 de Powershell. Depuis il y a eu qq améliorations/corrections. Mnt les modules prérequis sont chargés

    Un exemple rapido à partir de ton code :
    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
    52
    53
    54
    55
    56
     
    @'
    $Script:LogFileName ="C:\temp\LogFileName.txt"
     
    #$CurrentScript = "$PSCommandPath".Substring($PSScriptRoot.Length+1) 
    #$Script:CS = $CurrentScript.PadRight(20)
    #$CST = $CS + " " + (get-date -Format G) + " " + $MSGLOG01
     
     
    Function Add-Log {
        [cmdletBinding()]
     Param(
        [PARAMETER(Mandatory=$true, HelpMessage='My First Argument')]
       [string] $MSGLOG01
     )
     
       $CallerScript=$PSCmdlet.SessionState.PSVariable.GetValue('PSCommandPath')
       Write-Debug  $CallerScript
     
       $CallerScriptRoot=$PSCmdlet.SessionState.PSVariable.GetValue('PSScriptRoot')
       Write-Debug $CallerScriptRoot
     
       $Caller=$CallerScript.Substring($CallerScriptRoot.Length+1)
     
       $Header = (get-date -Format G) + '  ' + $($Caller.PadRight(20)) +' '
     
       $CST = $Header + $MSGLOG01
       Write-host $MSGLOG01 -ForegroundColor black -BackgroundColor darkgray
       Add-Content $LogFileName $CST
     
       $CallStack="Call Stack`r`n$(Get-PSCallStack|Out-String)"
       Write-Debug $CallStack
     
       Add-Content $LogFileName $CallStack
     
       Add-Content $LogFileName 'La suite'
    }
     
    Function Get-LogFileName{
        param()
     return  $Script:LogFileName
    }
     
    Export-ModuleMember -Function 'Add-Log','Get-LogFileName'
    '@ > c:\temp\Log.psm1
     
    @'
    Import-Module C:\temp\Log.psm1 -force
    "Fait qq chose"
    Add-Log 'Message 1'
    '@ > c:\temp\CallLog.ps1
     
    cd c:\temp
    .\CallLog.ps1
    $F=get-LogFileName
    type $F
    Je te laisse regarder ça et peiner un peu

  6. #6
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut
    Re bonjour,

    Bon j'avoue la je galère j'ai essayé différente méthode, mais je n'y arrive vraiment pas.
    quand je crée le module pas de soucis, mais soit il garde le nom du module sois il ne fait rien,
    Il me fraudait vraiment un exemple pour comprendre.

    Merci d'avance,

  7. #7
    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 JulesP Voir le message
    Bon j'avoue la je galère
    Je veux bien te croire :-)
    Citation Envoyé par JulesP Voir le message
    Il me fraudait vraiment un exemple pour comprendre.
    Je t'en ai fournis un à partir de ton script et je l'ai testé rapido sous PS v5.1
    L'inverse est peut être préférable communique nous ce que tu as fait et avec ça on verra ce qu'il manque ou ce qu'il y en trop

  8. #8
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut
    j'avoue j'ai essayé ton script mais j'ai rien compris pourquoi y a t'il des @
    bon jusqu'à la ligne 42 ça va aussi
    Mais alors en dessous je pige plus rien??
    JE SUIS MAUVAIS

  9. #9
    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
    Les @ sont là pour déclarer des herestring, on garde le format de la chaîne.
    Citation Envoyé par JulesP Voir le message
    Mais alors en dessous je pige plus rien??
    C'est à dire la syntaxe? l'usage ?
    Je crée un fichier module, puis un fichier script et je les teste.
    Citation Envoyé par JulesP Voir le message
    JE SUIS MAUVAIS
    Je ne pense pas, tu débutes, nuance

  10. #10
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut
    Oui je début très fortement,
    Oui la syntaxe.
    Quand je copie-colle ton exemple dans powershell c'est rouge de partout,
    donc je copie que les lignes 1 à 42 et je corrige les erreurs mais ça ne fonctionne pas du tout

  11. #11
    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 JulesP Voir le message
    Oui je début très fortement,
    Oui la syntaxe.
    Quand je copie-colle ton exemple dans powershell c'est rouge de partout,
    Je n'ai pas ce comportement sous Windows 10 ps 5.1

    Il ne doit pas y avoir d'espace devant le signe '@ qui clôt la herestring.

    Tu peux créer les deux fichiers c:\temp\Log.psm1 et c:\temp\CallLog.ps1 dans un éditeur

  12. #12
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut
    Un grand merci j'avance et je comprends un peu mieux,
    La jusqu’à l'export module ça va mieux,
    maintenant comment je l’intègre a mes scripts ? grâce au 2ème bloc d'instruction c'est ça ?

  13. #13
    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 coquille
    Citation Envoyé par JulesP Voir le message
    maintenant comment je l’intègre a mes scripts ?
    Tu procèdes comme avec ton script d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Add-PrintLog -MSGLOG01
    Seul change le nom de la fonction et le chargement du module en tant que prérequis.
    Lit le code d'exemple proposé, le second script.

    Mais si tu poses la question c'est que tu n'as pas trop compris mon code d'exemple. Je me trompe ?

  14. #14
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut
    Bonjour,

    Oui c'est vrai je suis un peu pommé,
    J'ai créée le module,
    J'ai chargé le module dans un de mes scripts et voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Exception lors de l'appel de «*Substring*» avec «*1*» argument(s)*: «*startIndex ne peut pas être supérieur à la longueur de la chaîne.
    Nom du paramètre*: startIndex*»
    Au caractère C:\Users\....\Documents\WindowsPowerShell\Modules\LOG01\LOG01.psm1:21 : 4
    +    $Caller=$CallerScript.Substring($CallerScriptRoot.Length+1)
    +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ArgumentOutOfRangeException
     
    Impossible d’appeler une méthode dans une expression Null.
    Au caractère C:\Users\.....\Documents\WindowsPowerShell\Modules\LOG01\LOG01.psm1:23 : 46
    + ...  $Header = (get-date -Format G) + '  ' + $($Caller.PadRight(20)) +' '
    +                                                ~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
    Quand j'utilisé mon code mise au début voici le résultat que j'avais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    17/12/2019 10:30:33  GEDINT01.ps1         Durée Totale : 00:00:24 7/12/2019 10:37:02   Démarrage du traitement d'intégration des documents V***** dans la GRA
    Donc la date, l'heure, le nom du script et le "Add-PrintLog -MSGLOG01".
    maintenant avec le module je n'ai plus du tout cela,

    DONC OUI JE SUIS PERDU............. :'( :'(

  15. #15
    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 JulesP Voir le message
    DONC OUI JE SUIS PERDU
    Ce que je t'ai proposé c'était un exemple pour démarrer, toi tu veux tout suite le mettre en prod sans savoir comment le debugger.
    Là le mardi tu te prépares tes problèmes du vendredi .

    J'ai placé des traces, déclare $debugpreference='continue' tu devrais avoir un résultat, mais pour le moment c'est ceci qui pose pb :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $CallerScriptRoot=$PSCmdlet.SessionState.PSVariable.GetValue('PSScriptRoot')
      Write-Debug $CallerScriptRoot
    Quelle version de powershell utilises-tu (cf. $PSVersionTable ) ?
    Tu peux aussi insérer des valeur par défaut dans les variables $caller et $callerXXX.

  16. #16
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Par défaut
    Bonjour,

    HA non non je veux pas mettre en prod tout de suite, je fais des tests pour essayer de comprendre, c'est pas simple...
    La version est : PSVersion 5.1.14409.1018.

    je n'ai rien avec la commande :
    $debugpreference='continue'

    Merci pour tout

  17. #17
    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 JulesP Voir le message
    HA non non je veux pas mettre en prod tout de suite,
    Ok, au temps pour moi.

    Citation Envoyé par JulesP Voir le message
    je n'ai rien avec la commande :
    $debugpreference='continue'
    Après qq test la variable PSCommandPath n'est pas tjr renseigné.
    Elle l'est dans un script, mais pas dans un scriptblock, normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $sb={Add-Log 'Message 2'}
     &$sb
    Peux-tu me communiquer le code que tu utilises ?
    Et qu'as-tu comme résultat si tu modifes, dans le code du module, la fonction Add-Log comme ceci:
    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
     
    Function Add-Log {
        [cmdletBinding()]
     Param(
        [PARAMETER(Mandatory=$true, HelpMessage='My First Argument')]
       [string] $MSGLOG01
     )
     
       $CallStack="Call Stack`r`n$(Get-PSCallStack|Out-String)"
       Write-Debug $CallStack
     
       Add-Content $LogFileName $CallStack
     
       Add-Content $LogFileName 'La suite'
    }

Discussions similaires

  1. [Free Pascal] Appeler une fonction dans un script Lua
    Par Roland Chastain dans le forum Free Pascal
    Réponses: 4
    Dernier message: 08/02/2015, 11h55
  2. Réponses: 8
    Dernier message: 27/08/2009, 13h01
  3. Réponses: 4
    Dernier message: 01/04/2008, 15h24
  4. [JS] Appeler une fonction dans un script externe
    Par agent007se dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/03/2007, 12h30
  5. Réponses: 8
    Dernier message: 30/08/2006, 10h08

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