Bonjour à tous,

Après avoir écumé toutes les pages de technet, msdn, le scripting-guy et les mots clés de l'intitulé, je n'ai pas réussi à résoudre mon dilemme.

http://blogs.msdn.com/b/powershell/a...directory.aspx

Je fais appel à votre bon coeur !

Le contexte :

Je créé un script avec [cmdletbinding].
J'utilise l'attribut de validation [ValidateScript] pour tester l'existence du fichier tomcat-6.0.zip dans C:\Update_Pajee_2.1.3\setup\BIN\PAJEE.
Le but est d'exécuter le script toujours à partir de l'emplacement du script et non à partir du répertoire courant, exemple : pour un déploiement via SCCM



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
[cmdletbinding()]
param( [ValidateScript({
                     Test-Path -path (Join-Path -path (Split-Path -parent -path $MyInvocation.MyCommand.Path) -childpath setup\bin\pajee\$_
                     )})]
             [string]$Tomcat
		)

$tomcat
Message d'erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
C:\Update_Pajee_2.1.3\path.ps1 : Impossible de valider l'argument sur le paramètre «*Tomcat*». Impossible de lier l'argument au paramètre «*Path*», car il a la valeur Null.
Au niveau de ligne*: 1 Caractère*: 11
+ .\path.ps1 <<<<  tomcat-6.0.zip
    + CategoryInfo          : InvalidData: (:) [path.ps1], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,path.ps1
J'en déduis - peut être à tort - que $myinvocation.mycommand.path est vide.

Ceci étant j'ai fais beaucoup de test, dont 2 intéressant :

  1. Porté du script

    j'exécute le script suivant

    PS C:\Update_Pajee_2.1.3> .\path.ps1 tomcat-6.0.zip

    qui contient le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [cmdletbinding()]
    param(  
    	[string]$Tomcat
    		)
    
    Test-Path -path (Join-Path -path (Split-Path -parent -path $MyInvocation.MyCommand.Path) -childpath setup\bin\pajee\$tomcat)
    Et le résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PS C:\Update_Pajee_2.1.3> .\path.ps1 tomcat-6.0.zip
    True
    Je change de répertoire courant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PS C:\Update_Pajee_2.1.3> cd \
    PS C:\> C:\Update_Pajee_2.1.3\path.ps1 tomcat-6.0.zip
    True
    Ca marche.

    Mais ma contrainte est de le fournir dans [ValidateScript] pour valider l'existence du fichier (en cas d'erreur de syntaxe ou inexistence du fichier).

  2. Portée du module

    Je travaille essentiellement avec des modules (fichiers *.psm1).
    Donc j'ai réutilisé la fonction du site de stackoverflow

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Get-ScriptDirectory
    {
        Split-Path $script:MyInvocation.MyCommand.Path
    }
    Puis dans un script je fais un join-path avec la fonction et le chemin setup\bin\pajee\$tomcat dans le [ValidateScript], j'avais un message d'erreur, mais un "bon" message d'erreur... celui qui vous dit justement que la variable n'est pas validée à $true, veuillez trouver le problème....

    Donc ça veut dire 2 choses, ça marche dans les param, sauf qu'il me renvoie pas le chemin du script mais celui du module, et la seconde, c'est en essayant de tester autre que $script, soit $local, $global... puis au niveau de la fonction, au moins 20 tests croisés(dont la création d'une fonction dans le [validatescript], avec toutes les variantes de portées), et bien ça marche toujours pas, mais je sens que je ne suis pas loin, j'ai la tête tellement dans le guidon, que je dois faire une boulette de newbie et que je n'arrive plus à réfléchir normalement.


Je continue à chercher, le premier de nous tous qui saurait orienter vers une idée nouvelle, logique, exotique... je prends !

Cordialement,
Vincent