ValidateScript , split-path et $myinvocaton.mycommand.path
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:
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:
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 :
- 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:
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:
1 2 3
|
PS C:\Update_Pajee_2.1.3> .\path.ps1 tomcat-6.0.zip
True |
Je change de répertoire courant
Code:
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).
- Portée du module
Je travaille essentiellement avec des modules (fichiers *.psm1).
Donc j'ai réutilisé la fonction du site de stackoverflow
Code:
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