Question [Résolu]Relecture de script / conversion en module

Plus d'informations
il y a 10 ans 11 mois #19459 par Cédric MORIN
Bonjour !

Cela fait quelque temps que je me suis lancer dans l'administration via PowerShell. J'ai écrit tout un tas de script qui me simplifie la vie.

Cependant ma connaissance du langage est assez... empirique ^^ J'ai appris pas mal de trucs tout seul en me documentant, en recopiant des bout de scripts trouvés sur le web, en faisant tout un tas d'essais assez drôle parfois. C'est assez formateur mais du coup, certains choses m'échappent encore.

Du coup, j'aimerais bien quelques conseils pour pouvoir m'améliorer encore plus :-)

J'ai 7 scripts que j'utilise régulièrement dans le cadre de mon boulot. L'idée qui me trotte dans la tête depuis quelque temps serait de faire un module maison avec ces scripts que je pourrais fournir à mes collègues afin qu'il puissent les utiliser.

Sauf que... Ben c'est pas aussi simple que cela en a l'air ! A priori, de ce que j'ai compris, mes scripts fonctionne très bien mais il me faudrait les retravailler pour que je puisse en faire ce que je veux.

Il sont a peu prés tout fabriqués sur le même modelés, donc je pense que si j'en améliore un (et que je comprend !) je pourrais améliorer les autres et enfin le faire, ce fameux module !

Voici donc un script assez simple. Il se contente de chercher dans l'AD les machines qui correspondent au paramètres Pattern, et affiche les groupes dans la ou les machines sont membres. Si on lui passe le paramètre Liste, il se contente d'afficher la liste des machines.

[code:1]
<#
.SYNOPSIS
Affiche une machine et les groupes associés

.DESCRIPTION
Affiche une machine et les groupes associés

.PARAMETER Pattern
Nom complet ou non de l'ordinateur a afficher

.PARAMETER Liste
Si present, affiche uniquement la liste des machines

.EXAMPLE
Get-Computer -Pattern GBA-01234
Affiche les groupes affecté a la machine GBA-01234

.EXAMPLE
Get-Computer -Pattern *234*
Affiche les noms de machine contenant 234 ansi que leur groupes

.NOTES
File Name : Get-Computer.ps1
Author : CedricM

#>

#region Paramètres
Param
(
[Parameter(Mandatory=$True,Position=0)]
[string]
$Pattern,

[Parameter(Mandatory=$False)]
[Switch]
$Liste
)
#endregion

Function GetComputer
{
# Import du module AD s'il n'est pas déjà présent
If ( -not (Get-Module -Name ActiveDirectory))
{
Import-Module -Name ActiveDirectory
}

$Pattern = \"*\" + $Pattern + \"*\"
$Result = Get-ADComputer -Filter 'Name -like $Pattern'

Write-Host
ForEach ($Computer in $Result)
{
Write-Host \"Machine :\" $Computer.Name
If (!$Liste)
{
#Récupération des groupes dont la machine est membre.
$Properties = Get-ADComputer -Identity $Computer -Properties MemberOf
Write-Host \"Liste des groupe dont la machine est membre :\"
Write-Host
ForEach ($Element in $Properties.MemberOf)
{
$Groupe = Get-ADGroup $Element
Write-Host $Groupe.Name
}
Write-Host
}
}
}

#Appel de la fonction
GetComputer($Pattern,$Liste)
[/code:1]

J’appelle le script avec .\Get-Computer, en appuyant sur la touche tab, cela me fait apparaître les paramètres, comme un cmdlet.

Voila ! Alors, que puis-je faire pour l'améliorer ?

Cédric.

PS: Désolé pour l'orthographe surement calamiteuse, je me soigne mais c'est pas facile !<br><br>Message édité par: Arnaud, à: 9/04/15 17:33

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 11 mois #19460 par Gabriel
Réponse de Gabriel sur le sujet Re:Relecture de script
Bonjour Cédric

ton script en tant que tel va bien.

j'ai le meme processus d'apprentissage que toi. Je te rassure ca fait toujours drole de relire un script vieux de 2 ans (une bonne claque et de gros four rire en pensant comment tu t'es pris la tete a l'epoque)

puis j'ai vu cette video: Turn PowerShell Commands into Reusable CLI and GUI Tools . C'est une session MSDN. C'est plein d'humour et c'est vraiment du pas a pas pour transfomer un script en un toolkit pour les copains

le presentateur est Don Jones, il a écrit ce livre

j'espère que tu comprend l'anglais, car il est en V.O. malheureusement.

ça été une révélation. Pour te dire que je donne a voir à tous mes nouveaux collaborateurs (bon il y en a un qui y a échappé, mais lui on l'a pris parce qu'il bouffe du code au petit dej'... :) )

Si après le visionnage de cette vidéo (1h quand même, mais tu peux la télécharger) tu va revoir tes scripts d'une autre facon B)

bonne chance.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 11 mois #19461 par Cédric MORIN
Réponse de Cédric MORIN sur le sujet Re:Relecture de script

ton script en tant que tel va bien.


Merci ! Oui, il fait ce que je lui demande et c'est déjà ça :-)

une bonne claque et de gros four rire en pensant comment tu t'es pris la tete a l'epoque


Comme beaucoup je crois :-)

Je télécharge la vidéo, j’espère que c'est sous-titré, parce que je comprend très mal la anglophones natif !

Est-ce que tu saurais me dire comment rendre la fonction accessible en la \&quot;dotsourcant\&quot; ? (Je crois que c'est le terme que j'ai vu passé.)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 11 mois #19462 par Gabriel
Réponse de Gabriel sur le sujet Re:Relecture de script
Cédric je ne croix pas qu'elle soit sous-titré tu verras la video c'est l'ecran de la personne.

tu vas passé a coté des blagues mais elle reste lisible.

ce que tu demandes ci-dessous, il te suffit de l'appeler comme ceci
[code:1]
PS D:\Dev\. .\Get-Computer.ps1
[/code:1]

[code:1]
Function GetComputer{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$True,Position=0)]
[string]
$Pattern,

[Parameter(Mandatory=$False)]
[Switch]
$Liste
)

&lt;#
.SYNOPSIS
Affiche une machine et les groupes associés

.DESCRIPTION
Affiche une machine et les groupes associés

.PARAMETER Pattern
Nom complet ou non de l'ordinateur a afficher

.PARAMETER Liste
Si present, affiche uniquement la liste des machines

.EXAMPLE
Get-Computer -Pattern GBA-01234
Affiche les groupes affecté a la machine GBA-01234

.EXAMPLE
Get-Computer -Pattern *234*
Affiche les noms de machine contenant 234 ansi que leur groupes

.NOTES
File Name : Get-Computer.ps1
Author : CedricM

#&gt;
# Import du module AD s'il n'est pas déjà présent
If ( -not (Get-Module -Name ActiveDirectory))
{
Import-Module -Name ActiveDirectory
}


$Pattern = \&quot;*\&quot; + $Pattern + \&quot;*\&quot;
$Result = Get-ADComputer -Filter 'Name -like $Pattern'

ForEach ($Computer in $Result)
{
Write-Host \&quot;Machine :\&quot; $Computer.Name
If (!$Liste)
{
#Récupération des groupes dont la machine est membre.
$Properties = Get-ADComputer -Identity $Computer -Properties MemberOf
Write-Host \&quot;Liste des groupe dont la machine est membre :\&quot;
Write-Host
ForEach ($Element in $Properties.MemberOf)
{
$Groupe = Get-ADGroup $Element
Write-Host $Groupe.Name
}
}
}
}
[/code:1]

je te conseille de \&quot;renommer\&quot; tes fonctions en suivant la regle suivante

get-computer -&gt; get-ABCComputer

ou ABC c'est ce que que tu veux (ca peut etre l'acronyme de ta boite, ou un WTF)

l'idee c'est de rendre unique le nom, pour ne pas confondre les fonctions qui pourraient venir d'autres modules

exemple il y a un snapin Quest pour se connecter a l'AD, comme il y a un module AD dans Windows

la meme cmdlet:
get-QADComputer -&gt; Quest
get-ADComputer -&gt; MS

comme ca il y a pas d'erreur possible :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 11 mois #19471 par Cédric MORIN
Réponse de Cédric MORIN sur le sujet Re:Relecture de script
Et bien ça marche !

Par contre, du coup, si je refait mes scripts de cette façon, je ne peut plus les utiliser directement. A savoir que je n'ai plus la complétion des paramètres lorsque j'utilise la touche tab. Et même si je met les paramétrés correctement, il n’exécute rien.

Donc, c'est soit une version utilisable directement, soit une version fonction à importé ?

PS: J'ai bien noté pour le nom, je vais donc le faire aussi.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 11 mois #19472 par Arnaud Petitjean
Réponse de Arnaud Petitjean sur le sujet Re:Relecture de script
Hello !

La création d'un module est super simple en fait.

En gros il suffit de créer un script PowerShell contenant toutes les fonctions les unes à la suite des autres et de l'enregistrer avec l'extension .psm1. Il est possible (préférable mais non obligatoire) de créer un manifeste de module. Ce dernier est juste un autre script (grosse table de hachage) qui complète le fichier .psm1. La création d'un manifeste, pour se simplifier la vie, passe par la commande New-ModuleManifest.

Ensuite il suffit de copier le répertoire du module dans le Path de PowerShell c'est à dire à l'un des emplacement référencé par la variable d'environnement PSModulePath. Si tu utilises PowerShell v3, l'importation des modules et automatique. Du coup tes fonctions seront de suite disponibles dans la console.

Une dernière chose concernant le nommage des fonctions composant ton module. Comme le suggère Tonic8 :

Je te conseille de \&quot;renommer\&quot; tes fonctions en suivant la regle suivante

get-computer -&gt; get-ABCComputer

ou ABC c'est ce que que tu veux (ca peut etre l'acronyme de ta boite, ou un WTF)...


En effet l'ajout d'un préfixe devant la partie \&quot;nom\&quot; de la commande (verbe-nom) est très utile. Tu peux spécifier un préfixe lors de l'import du module grâce à la commande :
[code:1]Import-Module -name MorinCedric -Prefix WTF[/code:1]

Ainsi toutes les fonctions exportées de ton module hériteront automatiquement du préfixe.

Depuis PowerShell 4, le préfixe est spécifiable dans le manifeste de module (le fameux fichier .psd1) via la propriété DefaultCommandPrefix.

Arnaud<br><br>Message édité par: Arnaud, à: 9/04/15 13:48

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.049 secondes
Propulsé par Kunena