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 :

ValidateScript , split-path et $myinvocaton.mycommand.path


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de suchiwa
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2010
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 435
    Par défaut 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 : 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

  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,
    quelle version de PS et quel OS utilises-tu ?

  3. #3
    Membre émérite Avatar de suchiwa
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2010
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 435
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Salut,
    quelle version de PS et quel OS utilises-tu ?
    Bonjour Laurent,

    PS Version 2.0 sous Windows 2008 server.
    Je devrais le faire aussi sous Windows Server 2012 Standard R2 et PS 4.0 et .Net Framework 4.5.

    J'ai regardé sur le technet, l'aide sur les foncitons avancées, [ValidateScrip] est disponible pour une version 2.0.

    Merci pour ton retour.

    Vincent

  4. #4
    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 suchiwa Voir le message
    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.
    PS me fait cela aussi qq fois.


    Commençons, à priori, par le plus facile la v4, la variable automatique $PSScriptRoot est désormais accessible dans les scripts et dans les modules.
    A tester si cette variable est injectée avant l'exécution de la clause param.

    Pour la v2, comme le dit msorens sur StackOverflow, le résultat dépend d'ou tu appelles la variable $MyInvocation.
    Comme tu es dans la clause param d'un script exécuté sur la ligne de commande, les infos recherchées ne sont pas renseignées, comme dit ici.

    Si tu utilises une fonction retardant la validation cela fonctionne, et en cas d'erreur l’exception est propagée.

    Quant au fait de copier la fonction dans un module, cela apporte un pb supplémentaire, car tu l'appelles dans ton script, mais les deux codes n'utilise pas le même état de session.
    Il faut donc utiliser du code 'avancé' :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #testpathModule.psm1
    function Get-ScriptDirectory1
    { Split-Path $script:MyInvocation.MyCommand.Path }
    
    function Get-ScriptDirectory2
    {
     $Invocation = (Get-Variable MyInvocation -Scope 1).Value
     Split-Path $Invocation.MyCommand.Path
    }
    
    function Get-ScriptDirectory3
    {
    [CmdletBinding()]  
    param()
     $PipelineObjectInScopeOfCaller=$PSCmdlet.SessionState.PSVariable.Get("MyInvocation").Value
     if ($PipelineObjectInScopeOfCaller -eq $null)
     {write-host "PipelineObjectInScopeOfCaller is null" -fore green}
     else 
     {
       # $PipelineObjectInScopeOfCaller.MyCommand|select *
       Split-Path $PipelineObjectInScopeOfCaller.MyCommand.Definition 
     } 
    }
    Selon son emplacement sur le FileSysteme, les fonctions Get-ScriptDirectory1 et 2 renverront un chemin différent de celui de Get-ScriptDirectory3.
    Cette dernière pointe sur l'état de session de l'appelant, là ou les deux premières pointent sur celui du module.

    La fonction de test:
    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
    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
    94
    95
    96
    97
    98
    99
    
    [CmdletBinding()]
    param([ValidateScript({
                         function GetMyDir
                          {
                           $Invocation = (Get-Variable MyInvocation -Scope 1).Value
                           if ($Invocation.MyCommand.path -eq $null) {write-host "path is null" -fore green}
                           if ($Invocation.MyCommand.Definition -eq $null) {write-host "Definition is null" -fore green}
                          }
                         Write-Debug "MyInvocation.MyCommand.Path=$($MyInvocation.MyCommand.Path)"
                         Write-Debug "MyInvocation.MyCommand.Definition = $(split-path -parent $MyInvocation.MyCommand.Definition)"
                         Write-Warning "Get-ScriptDirectory1=$(Get-ScriptDirectory1)"
                         Write-Warning "Get-ScriptDirectory2=$(Get-ScriptDirectory2)"
                         Write-Warning "Get-ScriptDirectory3=$(Get-ScriptDirectory3)"
                         Write-Warning "GetMyDir=$(getMyDir)"
                         
                         $MyInvocation|export-clixml c:\temp\t.xml
                         $MyInvocation.MyCommand|export-clixml c:\temp\t2.xml
                         Write-host "Test-Path -path (Join-Path -path (Split-Path -parent -path $($MyInvocation.MyCommand.Path)) -childpath setup\$_)"
                         Write-host "Test-Path -path (Join-Path -path (Split-Path -parent -path $($MyInvocation.MyCommand.Definition)) -childpath setup\$_)"
                         #Test-Path -path (Join-Path -path (Split-Path -parent -path $($MyInvocation.MyCommand.Definition)) -childpath setup\$_)
                         $true #force la validation
                         })]
                 [string]$Tomcat
            )
        
    function test {
    [cmdletbinding()]
    param( [ValidateScript({
                          function GetMyDir
                          {
                           $Invocation = (Get-Variable MyInvocation -Scope 1).Value
                           if ($Invocation.MyCommand.path -eq $null) {write-host "path is null" -fore green}
                           if ($Invocation.MyCommand.Definition -eq $null) {write-host "Definition is null" -fore green}
                          }
                         Write-Debug "MyInvocation.MyCommand.Path=$($MyInvocation.MyCommand.Path)"
                         Write-Debug "MyInvocation.MyCommand.Definition = $(split-path -parent $MyInvocation.MyCommand.Definition)"
                         Write-Warning "Get-ScriptDirectory1=$(Get-ScriptDirectory1)"
                         Write-Warning "Get-ScriptDirectory2=$(Get-ScriptDirectory2)"
                         Write-Warning "Get-ScriptDirectory3=$(Get-ScriptDirectory3)"
                         Write-Warning "GetMyDir=$(getMyDir)"
    
                         $MyInvocation|export-clixml c:\temp\F.xml
                         $MyInvocation.MyCommand|export-clixml c:\temp\F2.xml
                         Write-host "Test-Path -path (Join-Path -path (Split-Path -parent -path $($MyInvocation.MyCommand.Path)) -childpath setup\$_)"
                         Write-host "Test-Path -path (Join-Path -path (Split-Path -parent -path $($MyInvocation.MyCommand.Definition)) -childpath setup\$_)"
        #!!!!  Todo changer le chemin testé dans la ligne suivante
                         Test-Path -path (Join-Path -path (Split-Path -parent -path $MyInvocation.MyCommand.Path) -childpath setup\$_)
                         })]
                 [string]$Tomcat
            )
    
    Write ('='*80)
    # Write-Debug "MyInvocation.MyCommand.Path=$($MyInvocation.MyCommand.Path)" -> null
    # Write-Debug "MyInvocation.MyCommand.Definition = $($MyInvocation.MyCommand.Definition)" -> du code
    Write-Debug "Tomcat=$Tomcat"
    
    Write-Warning 'Get-ScriptDirectory1'
    Get-ScriptDirectory1
    Write-Warning 'Get-ScriptDirectory2'
    Get-ScriptDirectory2
    Write-Warning 'Get-ScriptDirectory3'
    #Get-ScriptDirectory3 -Exception sur Split-path
    
    }
    Write ('-'*80)
    test 'tomcat-6.0.zip'
    
    return
    
    #code de test
    
    cd c:\temp
    ipmo .\setup\testpathModule.psm1
    #ipmo .\testpathModule.psm1
     
     .\testPath.ps1 'tomcat-6.0.zip'
    
    
    $sb={
       #recharge les objets sérialisés
      $o=import-clixml c:\temp\t.xml
      $o2=import-clixml c:\temp\t2.xml
      $f=import-clixml c:\temp\f.xml
      $f2=import-clixml c:\temp\f2.xml
    
       #Affiche le contenu des objets sérialisés
      Write-Warning '$o'
      $o|select * -ExcludeProperty script*
      Write-Warning '$o2'
      $o2|select * -ExcludeProperty script*
      Write-Warning '$f'
      $f|select * -ExcludeProperty script*
      Write-Warning '$f2'
      $f2|select * -ExcludeProperty script*
    }
    &$sb
    #voir aussi Get-InvocationInfo.ps1 : http://poshcode.org/2156
    Le truc c'est que ce dernier code ne fonctionne pas avec la V3 ;-)
    Le parseur est légèrement perdu avec le code de debug placé dans l'attribut, en tout cas à un comportement différent de celui de la V2...

Discussions similaires

  1. Différence entre le conventional path et le direct path
    Par Francky44003 dans le forum Débuter
    Réponses: 4
    Dernier message: 15/12/2011, 17h30
  2. Réponses: 1
    Dernier message: 16/07/2009, 14h04
  3. récupérer le path system
    Par Eugénie dans le forum MFC
    Réponses: 4
    Dernier message: 22/12/2003, 13h03
  4. Réponses: 3
    Dernier message: 10/06/2003, 14h16
  5. Redhat-9 changer le path des databases
    Par jean christophe dans le forum Installation
    Réponses: 7
    Dernier message: 30/05/2003, 17h53

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