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 :

Multi fichier de function


Sujet :

Scripts/Batch

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Multi fichier de function
    Bonjour a tous,

    J'ai plusieurs questions autour du PowerShell, je suis technicien IT.
    Jusqu'à maintenant j'ai toujours réussi à utiliser PowerShell, Bat et autre langages dans le web.

    Donc mon problème est sur le langage PowerShell, pour un besoin particulier, je suis obligé de "spliter" des functions en plusieurs fichiers, tous ça pour mettre en multilingue mes scripts !

    Dans le concret et pour l'exemple :

    Voici mon fichier exemple, le code copié se trouve sur le site : https://www.supinfo.com/articles/sin...gue-powershell


    monfichier.ps1
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    Function PrepareFRString() 
    {
        $FR.Main = "Bonjour <XXX>, vous avez choisi le Français"
        $FR.Question = "Comment t'appelles-tu ?"
        $FR.Console = "Terminé"
        $FR.End = "Au revoir"
    }
     
    Function PrepareENString() 
    {
        $EN.Main = "Hello <XXX>, you’ve choose English"
        $EN.Question = "What’s your name ?" 
        $EN.Console = "Over"
        $EN.End = "See You"
    }
     
    Function PrepareITString()
    {
        $IT.Main = "Buongiorno <XXX>, avete scelto Italiano" 
        $IT.Question = "Come ti chiami ?"
        $IT.Console = "Finito"
        $IT.End = "Ciao"
    }
     
    Function PrintText($id)
    {
        # récupérer la chaîne $id en Français, en Anglais ou en Italien
        Switch($Lang){
            "FR"{$text = $FR.$id } 
            "EN"{$text = $EN.$id }
            "IT"{$text = $IT.$id }
            Default {Return ("ERROR")}}
        #Remplacer les placeholders par le texte attendu
        $regexp = [regex]'<XXX>'
        foreach ($arg in $args)
        { $text = $regexp.Replace($text, [String]$arg,1) }
        return $text}
     
    Function WriteToFile($text,$space)
    {
        if($space -eq "before"){Write-Output "" $text | Out-File $ReportFile -Encoding utf8 -append}
        elseif($space -eq "after"){Write-Output $text "" | Out-File $ReportFile -Encoding utf8 -append}
        elseif($space -eq "both"){Write-Output "" $text "" | Out-File $ReportFile -Encoding utf8 -append}
        else{Write-Output $text | Out-File $ReportFile -Encoding utf8 -append}
    }
     
    Function NameFile
    {
        $computerName = [system.environment]::MachineName
        $date = Get-date -format "dd_MM_yyyy"
        $hour = Get-Date -Format "HH_mm_ss"
        $fileName = "$computerName-$Lang-$hour-$date.txt" #nom du fichier
        return $FileName
    }
     
    Function AskName
    {
        Write-Host (PrintText Question)
        $name = Read-Host
        return $name
    }
     
    $FR = @{}
    $EN = @{}
    $IT = @{}
     
    Write-Host @"
    ===============================
    | Welcome/Bienvenue/Benvenuti |
    ===============================
    "@ -ForegroundColor Yellow
    Do{
         Write-Host "`nPlease select your Language :" -ForegroundColor Yellow
         Write-Host  "`n1. Francais`n2. English`n3. Italiano`n4. Exit`n"
         $Language = Read-Host
         switch ($Language){
               1 {$Lang = "FR"
                  PrepareFRString}
               2 {$Lang = "EN"
                  PrepareENString}
               3 {$Lang = "IT"
                  PrepareITString}
               4 {Read-Host "See You/Au revoir/Ciao"
                    Exit}}}
    While ($Language -notin 1..4)
     
    $Name = AskName
    $reportFile = NameFile
     
    WriteToFile (PrintText Main $Name) "after"
    WriteToFile (PrintText End)
    Write-Host (PrintText Console)

    Le but est de prendre les functions de langue qu'on trouve au début du code, pour en créer des fichiers séparés :

    french.ps1
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function PrepareFRString() 
    {
        $FR.Main = "Bonjour <XXX>, vous avez choisi le Français"
        $FR.Question = "Comment t'appelles-tu ?"
        $FR.Console = "Terminé"
        $FR.End = "Au revoir"
    }

    english.ps1
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function PrepareENString() 
    {
        $EN.Main = "Hello <XXX>, you’ve choose English"
        $EN.Question = "What’s your name ?" 
        $EN.Console = "Over"
        $EN.End = "See You"
    }

    et pour couronner le tout dans un dossier lang, ce qui me donne la structure comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    RootDirectory
    |   monfichier.ps1
    |
    +---lang
    |   |   french.ps1
    |   |   english.ps1
    et là je ne sais pas comment faire ! Dans le web pour du CSS, ou même JS, il suffit de faire un <link rel="stylesheet" type="text/css" href="mystyle.css">, pour PHP c'est plutôt un include 'myfunctions.php' mais dans PowerShell … je ne sais pas, et là j'ai vraiment besoin d'aide…

    Bien-sûr j'ai essayé avec un Import-module .\lang\french.ps1 -Force mais sans succès..


    Par avance merci pour votre aide !

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous,

    Bon pour ceux/celles qui seront intéressé par une 1er réponse, j'ai trouvé une petite astuce qui s'appel "Dot Sourcing"
    En d'autre terme, mettre un "dot" ( un point ) en premiere ligne puis faire un appel du fichier commençant par un ".\"

    Code POWERSHELL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    . .\l18\french.ps1
    . .\l18\english.ps1


    Ce qui nous fait comme fichier principal :

    TryLang.ps1
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    . .\l18\french.ps1
    . .\l18\english.ps1
     
     
    Function PrintText($id)
    {
        # récupérer la chaîne $id en Français, en Anglais ou en Italien
        Switch($Lang){
            "FR"{$text = $FR.$id } 
            "EN"{$text = $EN.$id }
            "IT"{$text = $IT.$id }
            Default {Return ("ERROR")}}
        #Remplacer les placeholders par le texte attendu
        $regexp = [regex]'<XXX>'
        foreach ($arg in $args)
        { $text = $regexp.Replace($text, [String]$arg,1) }
        return $text}
     
    Function WriteToFile($text,$space)
    {
        if($space -eq "before"){Write-Output "" $text | Out-File $ReportFile -Encoding utf8 -append}
        elseif($space -eq "after"){Write-Output $text "" | Out-File $ReportFile -Encoding utf8 -append}
        elseif($space -eq "both"){Write-Output "" $text "" | Out-File $ReportFile -Encoding utf8 -append}
        else{Write-Output $text | Out-File $ReportFile -Encoding utf8 -append}
    }
     
    Function NameFile
    {
        $computerName = [system.environment]::MachineName
        $date = Get-date -format "dd_MM_yyyy"
        $hour = Get-Date -Format "HH_mm_ss"
        $fileName = "$computerName-$Lang-$hour-$date.txt" #nom du fichier
        return $FileName
    }
     
    Function AskName
    {
        Write-Host (PrintText Question)
        $name = Read-Host
        return $name
    }
     
    $FR = @{}
    $EN = @{}
    $IT = @{}
     
    Write-Host @"
    ===============================
    | Welcome/Bienvenue/Benvenuti |
    ===============================
    "@ -ForegroundColor Yellow
    Do{
         Write-Host "`nPlease select your Language :" -ForegroundColor Yellow
         Write-Host  "`n1. Francais`n2. English`n3. Italiano`n4. Exit`n"
         $Language = Read-Host
         switch ($Language){
               1 {$Lang = "FR"
                  PrepareFRString}
               2 {$Lang = "EN"
                  PrepareENString}
               3 {$Lang = "IT"
                  PrepareITString}
               4 {Read-Host "See You/Au revoir/Ciao"
                    Exit}}}
    While ($Language -notin 1..4)
     
    $Name = AskName
    $reportFile = NameFile
     
    WriteToFile (PrintText Main $Name) "after"
    WriteToFile (PrintText End)
    Write-Host (PrintText Console)

    Les fichiers de langue sont séparé, une langue par fichier et dans un dossier : l18

    french.ps1
    Code POWERSHELL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function PrepareFRString {
        $FR.Main = "Bonjour <XXX>, vous avez choisi le Français"
        $FR.Question = "Comment t'appelles-tu ?"
        $FR.Console = "Terminé"
        $FR.End = "Au revoir"
     
    }


    english.ps1
    Code POWERSHELL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function PrepareENString {
        $EN.Main = "Hello <XXX>, you’ve choose English"
        $EN.Question = "What’s your name ?" 
        $EN.Console = "Over"
        $EN.End = "See You"
     
    }

    italia.ps1
    Code POWERSHELL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function PrepareITString()
    {
        $IT.Main = "Buongiorno <XXX>, avete scelto Italiano" 
        $IT.Question = "Come ti chiami ?"
        $IT.Console = "Finito"
        $IT.End = "Ciao"
    }

    Et voila, au lancement du script TryLang.ps1, cela fonctionne très bien !


    Malgré tous, cela ne me conviens pas forcement… Trop facile pour éditer les fichier par la suite ! Donc je pense créer un module.
    Je ferais un petit retour sur ce dernier une fois que je maitrise un peu mieux !


    Bonne soirée les dev's !

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Trop facile pour éditer les fichier par la suite !
    C'est mal que se soit trop facile ?
    Pourquoi ne pas proposer des fichiers de type csv, xml ou texte pour les langages.

    Donc mon problème est sur le langage PowerShell, pour un besoin particulier, je suis obligé de "spliter" des functions en plusieurs fichiers, tous ça pour mettre en multilingue mes scripts !
    C'est quoi le besoin particulier qui justifie ça ?

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour ericlm128

    Deja, merci d'avoir rejoint a discussion, et desole pour les accents, le matin je suis sur un clavier QWERTY Espagnol !

    Pour repondre a tes 2 questions en même temps, cela m'est impose !
    Mais pour etre un peu plus precis :

    C'est mal que se soit trop facile ?
    Non, en developpement, oui en production...
    dans mon cas ( reseau entreprise ) les fichiers functions seront placer dans un dossier special, cacher/verouiller etc...

    Pourquoi ne pas proposer des fichiers de type csv, xml ou texte pour les langages.
    La petite histoire c'est une application code exclusivement en powershell. C'est le defi de la boite, en quelques sorte !
    Donc la boite accepte un fichier de type "settings.conf" qui est en realite un fichier texte et c'est tout !

    C'est quoi le besoin particulier qui justifie ça ?
    Spliter les functions, car mes fonctions sont utiliser par d'autres applications en PowerShell aussi !
    Donc elle doivente etre accessible depuis le shell rapidement, et certaine fonctions doivent etre totalement separe des autres !

    Voila, en esperant que cela a pu t'aider !

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Voila, en espérant que cela a pu t'aider !
    Eh bien je voit que tout ceci fait parti d'un vaste projet dont nous ne pouvons évaluer la pertinence sans une vision global.

    Bonne chance

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Eh bien je voit que tout ceci fait parti d'un vaste projet dont nous ne pouvons évaluer la pertinence sans une vision global.

    Bonne chance
    Est ce réellement nécessaire ou est ce une curiosité ?

    Ma demande, encore une fois, est très claire, comment splitter des functions ?

    Solution 1 : en utilisant le Dot Sourcing, exemple :
    Code POWERSHELL : Sélectionner tout - Visualiser dans une fenêtre à part
    . .\dossier\fichier.ps1
    Est ce que cela est compliqué ? Pourquoi demander plus ?

    Ce qui est dommage, c'est que cela pollue une demande pour pas grand chose !
    Alors est ce possible de répondre a ma question, en se basant sur l'exemple, si possible !

    Par avance merci

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Je n’appelle pas cela splitter des functions car elle reste entière dans un seul fichier.
    C'est plutôt un split de code ou une relocalisation/déport de function.
    Puisque ton projet est figé, je pense que pour appeler un autre script le Dot Sourcing est la meilleur solution.

    Tu peux aussi te renseigner sur les modules.

    Ou sur invoke-expression

    Tu peux aussi lancer ton script via powershell.exe -File ...

    ...

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Si t'es fichiers sont séparés, utiliser les mêmes noms de functions et variables te simplifiait grandement la vie.
    Il n'y aurait qu'a charger le bon fichier.

    french.ps1
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function PrepareString {
        $LANG.Main = "Bonjour <XXX>, vous avez choisi le Français"
        $LANG.Question = "Comment t'appelles-tu ?"
        $LANG.Console = "Terminé"
        $LANG.End = "Au revoir"
    }

    english.ps1
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function PrepareString {
        $LANG.Main = "Hello <XXX>, you’ve choose English"
        $LANG.Question = "What’s your name ?" 
        $LANG.Console = "Over"
        $LANG.End = "See You"
     }

    Désolé, je ne peux pas m’empêcher de dire qu'on pourrait faire mieux que le cahier des charges.

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Désolé, je ne peux pas m’empêcher de dire qu'on pourrait faire mieux que le cahier des charges.
    Oui je pense aussi, par exemple avec le mécanisme de localisation intégré à Powershell, un exemple.
    Et avec ceci tu peux même contrôler les différences de clés entre fichiers de localisation.

    Et il ne faut surtout pas faire ceci function PrepareENString.

Discussions similaires

  1. Multi fichier avec CCS
    Par Eagles_Eyes dans le forum C
    Réponses: 5
    Dernier message: 29/02/2008, 08h19
  2. [JavaScript] [SRC] Ajout dynamique de fichiers (Gmail style) et Upload multi fichiers
    Par rr404 dans le forum Contribuez
    Réponses: 0
    Dernier message: 07/08/2007, 15h25
  3. Réponses: 1
    Dernier message: 11/06/2007, 17h19
  4. Dev-C++ et applications multi-fichiers
    Par xillibit dans le forum Dev-C++
    Réponses: 3
    Dernier message: 12/04/2007, 17h15
  5. [phpMyAdmin] L'export multi-fichiers est-il possible ?
    Par Christophe Charron dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 19/10/2006, 00h04

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