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 :

Exécution d'un script avec paramètres [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Nouveau membre du Club Avatar de botLIA
    Homme Profil pro
    Étudiant en Licence 3 CDA
    Inscrit en
    Juin 2016
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant en Licence 3 CDA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 45
    Points : 29
    Points
    29
    Par défaut Exécution d'un script avec paramètres
    Bonjour,

    Dans mon script en PowerShell j'ai créer une liste global :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [System.Collections.ArrayList]$global:liste = [System.Collections.ArrayList]::new()
    Je la remplis avec différents test avec la méthode Add(),
    J'en ai besoin dans une autre page PowerShell, donc je l'exécute comme ceci dans mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    powershell.exe .\script.ps1 $global:list
    Et dans script.ps1 j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    param([System.Collections.ArrayList]$global:liste)
    Quand ensuite je l'affiche il ne se passe rien et quand je lance mes tests il le dit : "Indexation impossible dans un tableau null."

    Auriez-vous une solution ?

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2018
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    Salut,

    Afin de mieux comprendre ta demande:
    Pourquoi utilises-tu des fonctions .Net en Powershell pour créer un tableau?
    En powershell, tu peux créer des objets très simplement ainsi que des tableaux, j'ai du mal à comprendre du coup
    Peut-être une contrainte imposée ?

    J'ai aussi du mal à comprendre l’arborescente et l'architecture de tes scripts, si tu peux détailler un peu plus ça serait chouette

    Sinon techniquement pour déclarer un paramètre dans un script:
    au début de celui-ci.

    Ensuite, pour appeler le script et passer ta variable en paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    powershell.exe .\script.ps1 -liste $liste

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    tu sembles avoir des pb de portée, de plus lancer une autre session Powershell n'est pas nécessaire si tu es déjà dans une session.
    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
     
     [System.Collections.ArrayList]$global:liste = [System.Collections.ArrayList]::new()
     $global:liste.add(1) > $null
     $global:liste.add(2) > $null
     $global:liste.add(3) > $null
     &{param([System.Collections.ArrayList]$global:liste) $global:liste.count}
    #0
    &{param([System.Collections.ArrayList]$global:liste) $global:liste}
    #ras
    &{param([System.Collections.ArrayList]$global:liste) $global:liste.add(4)>$null }
    #Erreur 
    #Car ici on redéclares une variable qui n'est pas initialisée
    $global:liste
    #'vide'
    $null -eq $global:liste
    #true
     
    [System.Collections.ArrayList]$global:liste = [System.Collections.ArrayList]::new()
     $global:liste.add(1) > $null
     $global:liste.add(2) > $null
     $global:liste.add(3) > $null
    &{param() $global:liste.add(4)>$null }
    $global:liste
    #ceci fonctionne
    Ce qui confirme que l'usage de la portée Global c'est mal

  4. #4
    Nouveau membre du Club Avatar de botLIA
    Homme Profil pro
    Étudiant en Licence 3 CDA
    Inscrit en
    Juin 2016
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant en Licence 3 CDA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Pourquoi utilises-tu des fonctions .Net en Powershell pour créer un tableau?
    En powershell, tu peux créer des objets très simplement ainsi que des tableaux, j'ai du mal à comprendre du coup
    Peut-être une contrainte imposée ?

    J'ai aussi du mal à comprendre l’arborescente et l'architecture de tes scripts, si tu peux détailler un peu plus ça serait chouette
    Enfaite j'ai un peut de mal avec PowerShell par rapport aux autres langages, il y a des choses perturbantes comme les objet à multi constructeur, je n'avais encore jamais vu ca
    et le faite qu'il ne reconnaît pas mes objets sauf quand le script est en .ps1 et que je fais un Import-Module, ca n'a jamais marché autrement et qu'il ne veut pas entendre parlé de mes fonction mdrrr
    Mais c'est peut être moi, parce que je code un peut comme dans les autres langages, avec plein de pages, de fonction, d'objet.

    Sinon techniquement pour déclarer un paramètre dans un script :
    J'ai fais ce que tu me propose mais je pense que c'est ma liste qui est un problème parce que quand je l'a passe en paramètre à un script exécuté comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .\script.ps1 $maListe
    Cela fonctionne mais comme ca non (Elle est vide):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PowerShell.exe .\script.ps1 -liste $liste
    Et cette manière la d'exécuté le script c'est la seule qui fais qu'il reconnaît mes objet qu'elle est cette sombrerie mdrr
    Mais actuellement c'est une V1 ou une alpha, elle est sujet à amélioration parce que le code est obscure je pense...

  5. #5
    Nouveau membre du Club Avatar de botLIA
    Homme Profil pro
    Étudiant en Licence 3 CDA
    Inscrit en
    Juin 2016
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant en Licence 3 CDA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Ce qui confirme que l'usage de la portée Global c'est mal
    Oui je sais que c'est mal mais c'est une des solutions mis en avant pour résoudre mon problème sur le fait que la liste soit accessible vers plusieurs scripts.

    de plus lancer une autre session Powershell n'est pas nécessaire si tu es déjà dans une session.
    Enfaite si je fais ca c'est parce que c'est la façon qui permet au script de connaître mes objets et comme je suis un peut pris par le temps (stage de 1 mois), j'aimerais terminé la v1 avant vendredi,
    et j'aime pas commencé un projet sans le terminé ducoup je parade un peut les erreurs de façon un peut obscure.

    Tu pourrais m'axpliqué un peut le code que tu m'a donné, je ne comprend pas trop comment il fonctionne

    Merci à vous deux.

  6. #6
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2018
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    Peux-tu nous expliquer l'objectif de ton code ou de ton projet?
    Je pense qu'il sera plus simple de t'aider si on y voit plus clair dans l'idée générale

    Powershell c'est déconcertant si on lit la documentation ou les tutos, ça ressemble à une grosse bête baveuse et velue. Mais en fait non! Le plus simple c'est de se dire que tout est objet

    Un moyen de créer et alimenter un objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $AllObjects = @()
    $myObject = New-Object PsObject
    $myObject | Add-Member -TypeName NoteProperty -Name "Client" -Value "Boulangerie Moustachue"
    $myObject | Add-Member -TypeName NoteProperty -Name "Date" -Value "18/06/2018"
    $myObject | Add-Member -TypeName NoteProperty -Name "Priorité" -Value "12"
    Et tu peux ensuite créer un objet avec tous tes objets, dans une boucle, afin d'en tirer un joli tableau ou que sais-je :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $AllObjects += $myObject
    Le Add-Member tu peux le mettre dans une boucle pour l'alimenter.

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par botLIA Voir le message
    mais c'est une des solutions mis en avant pour résoudre mon problème sur le fait que la liste soit accessible vers plusieurs scripts.
    Peut-être faut-il comprendre les bases sur la notion de portée en Powershell avant d'utiliser la portée Global, je dis ça je dis rien
    Citation Envoyé par botLIA Voir le message
    Tu pourrais m'expliquer un peut le code que tu m'a donné, je ne comprend pas trop comment il fonctionne
    Quelle(s) ligne(s) ?
    Pour celle celle-ci
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    &{param([System.Collections.ArrayList]$global:liste) $global:liste.add(4)>$null }
    {} est un scriptblock, du code, et & est un opérateur d'exécution qui crée une nouvelle portée. Si une variable de même nom existe dans la portée parente, PS crée une nouvelle variable.

    Si on utilise le point ('.') au lieu du &, PS ne crée pas de nouvelle portée. Si une variable de même nom existe dans la portée parente, PS l'utilise.

    Mais dans ton cas tu déclares, dans la clause param, une variable de même nom, et ici PS (peu importe l'opérateur d'exécution utilisé) créera tjr une nouvelle variable de même nom, puisque c'est ce que tu lui demandes de faire : Crée un paramètre.

    Selon la trace :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    trace-command ParameterBinding  -e {&{param([System.Collections.ArrayList]$global:liste) $global:liste }} -pshost
     
    DEBUG: ParameterBinding Information: 0 : BIND arg [] to parameter [global:liste]
    DEBUG: ParameterBinding Information: 0 :     Executing DATA GENERATION metadata:
    [System.Management.Automation.ArgumentTypeConverterAttribute]
    DEBUG: ParameterBinding Information: 0 :         result returned from DATA GENERATION:
    DEBUG: ParameterBinding Information: 0 :     BIND arg [] to param [global:liste] SUCCESSFUL
     
    #affecte une liste
    trace-command ParameterBinding  -e {&{param([System.Collections.ArrayList]$global:liste) $global:liste } 1,2,3} -pshost
    PS crée bien une autre variable. Mais il faudrait le code complet pour être certain du comportement.

  8. #8
    Nouveau membre du Club Avatar de botLIA
    Homme Profil pro
    Étudiant en Licence 3 CDA
    Inscrit en
    Juin 2016
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant en Licence 3 CDA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Au final je me suis dit que la liste n'étais pas nécessaire parce que j'enregistre les données dans un CSV du coup au final je n'en implémente pas

    Peux-tu nous expliquer l'objectif de ton code ou de ton projet?
    En gros je fais une interface en PowerShell qui vérifie si les salariés qui se trouve dans le fichier Excel de la RH se trouve dans le fichier Excel de l'AD, du coup je part du principe que le fichier RH est bon et vérifié et je créer un fichier CSV solution pour l'AD avec toutes les informations des salariés et des comptes non salariés (eux je ne dois pas les vérifiés).

    Powershell c'est déconcertant si on lit la documentation ou les tutos, ça ressemble à une grosse bête baveuse et velue. Mais en fait non! Le plus simple c'est de se dire que tout est objet
    Enfaite avec le temps passé sur l'analyse des RECHERCHEV pour la vérification des informations et l'écris des algos, je n'avais pas trop le temps de lire les livres de formations sur PowerShell, même si je sais que ca m'aurais beaucoup servis mais par rapport au temps impartis je resterais dormir dans mon bureau mais je vais le faire plus tard.

    Je vais me penché sur la suite de ton message, merci

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2018
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    Salut,

    Ok je vois mieux le truc
    Du coup si c'est de l'excel et du CSV c'est encore plus simple !
    Le plus perf:
    1- Extraire les infos qui t'intéressent de ton Excel et les stocker dans un objet: $varRH
    2- Extraire les infos de ton AD avec du Get-ADUser -SearchBase "OU=base,DC=domaine,DC=privé" et stocker les infos qui t'intéressent dans un objet genre $varAD
    3- Comparer les deux, imaginons que tu ais une colonne Nom dans ton Excel de base et donc dans ta $varRH. Pour lire la colonne ça serait un $varRH.Nom
    Dans ton AD le nom correspondant serait la propriété Name, donc $varAD.Name.
    Pour comparer les deux: compare $varRH $varAD -IncludeEqual

    À voir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/11/2008, 12h27
  2. Exécution d'un projet avec paramètre en commande line
    Par FABFAB125 dans le forum Langage
    Réponses: 8
    Dernier message: 15/10/2008, 18h16
  3. Réponses: 3
    Dernier message: 07/08/2008, 10h00
  4. Appel de script avec paramètres
    Par anaon dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/05/2008, 08h38
  5. Exécution d'un script avec un outil ROSE
    Par locus dans le forum Rational
    Réponses: 2
    Dernier message: 08/11/2007, 11h43

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