mercredi 15 août 2012

le verbe "GET" dans les fonctions et les cmdlets

salut,

le verbe "GET" est l'un des verbes autorisés dans le nommage des fonctions et cmdlets
Get-Verb -verb get
on peux omettre ce verbe pour toutes les cmdlets et fonctions:
childitem c:\
psdrive
hotfix
sauf les cmdlets get-command et get-process ne supportent pas cette omission parceque le mot "process" est un mot reservé (help keywords) et "command" est vu par powershell comme etant le vieux shell "command.com" il est à noter aussi que les fonction ayant comme nom un mot reservé seront traiter comme étant des mots reservés et non pas comme étant des fonctions
man key | Select-String "\s{5,}about_*"
et s'il s'agissait d'un nom d'un executable alors l'interpréteur powershell traitera cette fonction omme étant une commande externe et non pas une fonction
function get-cmd {1}

ou bien:

function get-Function {1}
le revert de la médaille dans tout ça et qu'on ne pourra plus bénéficier de la puissance de la complétion de powershell
Service -n[TAB] alg
un autre désavantage de l'utilisation de ces commandes sans le verbe "GET", est que parfois avec la commandes get-help on se retrouve devant des resultats inatendus
PS D:\> help verb

NOM
    Write-Verbose
...
.....
voici une petite fonction qui s'appuie sur les mots reservé et teste si une commande est valide ou pas:
#############################################################
#
#  PS D:\> Test-CommandValidation -command get-process | fl
#            VerbNounConvention : True
#            ReservedKeyWords   : True
#            VerbConvention     : True
#
#############################################################
function Test-CommandValidation {
   param($Command)
   $keys = man key | 
             Select-String "(\S+)(?=\s{5,}about_*)" | 
                  select -expand Matches | 
                        select -expand value
   $verbNounConvention = $verbconvention = $reservedkeywords = $false
   $verb,$noun = $Command.Split('-')
   if($noun) {
      $verbNounConvention = $true
      if( (get-verb $verb) ) { $verbconvention = $true } 
      if($keys -contains $noun) { $reservedkeywords = $true }
   }
   else {
       $reservedkeywords = $verbconvention = $null
   }
    new-object PSObject -prop @{
       VerbNounConvention = $verbNounConvention
       VerbConvention = $verbconvention
       ReservedKeyWords = $reservedkeywords
    }
}


Aucun commentaire: