45 votes

Puis-je écrire un cours en utilisant PowerShell?

J'apprends toujours PowerShell et, jusqu'à présent, je n'ai pas trouvé de réponse sur ce site, malgré quelques recherches. Powershell étant construit sur le framework .NET, puis-je écrire ma propre classe personnalisée à l'aide de Powershell?

Je ne parle pas d'instanciation de classes .NET ... cette partie est assez simple. Je veux écrire mes propres classes personnalisées à l'aide de scripts PowerShell. Possible? Jusqu'ici, mes recherches m'amènent à dire que ce n'est pas possible. Mais je veux confirmer avec le premier gourou ...

50voto

ravikanth Points 9573

Examinez l'applet de commande Add-Type . Il vous permet d’écrire C # et d’autres codes dans PowerShell. Par exemple (à partir du lien ci-dessus),

 C:\PS>$source = @"
public class BasicTest
{
    public static int Add(int a, int b)
    {
        return (a + b);
    }

    public int Multiply(int a, int b)
    {
        return (a * b);
    }
}
"@

C:\PS> Add-Type -TypeDefinition $source

C:\PS> [BasicTest]::Add(4, 3)

C:\PS> $basicTestObject = New-Object BasicTest 
C:\PS> $basicTestObject.Multiply(5, 2)
 

44voto

EBGreen Points 14478

Je soupçonne que la solution que vous cherchez est Modules Powershell. Ils exécutent les rôles que les classes effectuent généralement dans d'autres langues. Ils vous donnent un très simple et structurée de manière à réutiliser votre code.

Voici comment obtenir la fonctionnalité des classes de PS en utilisant des modules. Sur la ligne de commande vous pouvez faire ceci:

New-Module -ScriptBlock {function add($a,$b){return $a + $b}; function multiply($a,$b){return $a * $b}; function supersecret($a,$b){return multiply $a $b}; export-modulemember -function add, supersecret}

Alors vous seriez en mesure de:

PS C:\> add 2 4
6
PS C:\> multiply 2 4
The term 'multiply' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was inc
luded, verify that the path is correct and try again.
At line:1 char:9
+ multiply <<<<  2 4
    + CategoryInfo          : ObjectNotFound: (multiply:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\> supersecret 2 4
8

Comme vous pouvez le voir multiplier privé dans le module. De plus, traditionnellement, vous inatantiate un objet est une instance du module. C'est fait via l'-AsCustomObject paramètre:

$m = New-Module -ScriptBlock {function add($a,$b){return $a + $b}; function multiply($a,$b){return $a * $b}; function supersecret($a,$b){return multiply $a $b}; export-modulemember -function add, supersecret} -AsCustomObject

Ensuite, vous pouvez:

PS C:\> $m.add(2,4)
6
PS C:\> $m.multiply(2,4)
Method invocation failed because [System.Management.Automation.PSCustomObject] doesn't contain a method named 'multiply'.
At line:1 char:12
+ $m.multiply <<<< (2,4)
    + CategoryInfo          : InvalidOperation: (multiply:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

PS C:\> $m.supersecret(2,4)

8

Tout cela illustre l'utilisation de modules Dynamiques sens rien n'est stocké sur le disque pour pouvoir les réutiliser. C'est bien pour des fonctionnalités simples. Si vous voulez réellement être capable de lire le code et de le réutiliser à l'avenir des sessions ou des scripts cependant, vous voulez le stocker dans un .psm1 fichier puis le stocker dans un dossier dans un dossier avec le même nom (sans l'extension) que le fichier. Vous pouvez ensuite importer le module dans votre session en ligne de commande ou dans un autre script.

Comme un exemple, disons que j'ai pris ce code:

function Add{
    param(
            $a,
            $b
         )
    return $a + $b
}
function Multiply{
    param(
            $a,
            $b
         )
    return $a + $b
}
function SuperSecret{
    param(
            $a,
            $b
         )
    return Multiply $a $b
}
Export-ModuleMember -Function Add, SuperSecret

Et enregistré dans un fichier appelé TestModule.psm1 dans le dossier: C:\Windows\System32\WindowsPowerShell\v1.0\Modules\TestModule

Le dossier Modules dans le Powershell dossier d'installation est une magie de dossier et de tous les modules qui y sont stockées sont visibles à l'Import-Module applet de commande sans avoir à spécifier un chemin d'accès. Maintenant, si nous courons Get-Module -List à la ligne de commande, nous voyons:

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Script     DotNet                    {}
Manifest   FileSystem                {Get-FreeDiskSpace, New-Zip, Resolve-ShortcutFile, Mount-SpecialFolder...}
Manifest   IsePack                   {Push-CurrentFileLocation, Select-CurrentTextAsVariable, ConvertTo-Short...
Manifest   PowerShellPack            {New-ByteAnimationUsingKeyFrames, New-TiffBitmapEncoder, New-Viewbox, Ne...
Manifest   PSCodeGen                 {New-Enum, New-ScriptCmdlet, New-PInvoke}
Manifest   PSImageTools              {Add-CropFilter, Add-RotateFlipFilter, Add-OverlayFilter, Set-ImageFilte...
Manifest   PSRss                     {Read-Article, New-Feed, Remove-Article, Remove-Feed...}
Manifest   PSSystemTools             {Test-32Bit, Get-USB, Get-OSVersion, Get-MultiTouchMaximum...}
Manifest   PSUserTools               {Start-ProcessAsAdministrator, Get-CurrentUser, Test-IsAdministrator, Ge...
Manifest   TaskScheduler             {Remove-Task, Get-ScheduledTask, Stop-Task, Add-TaskTrigger...}
Manifest   WPK                       {Get-DependencyProperty, New-ModelVisual3D, New-DiscreteVector3DKeyFrame...
Manifest   AppLocker                 {}
Manifest   BitsTransfer              {}
Manifest   PSDiagnostics             {}
Script     **TestModule**                {}
Manifest   TroubleshootingPack       {}
Manifest   Citrix.XenApp.Commands... {}

Nous pouvons voir que notre module est prêt à l'importation. On peut l'importer dans la session et de l'utiliser dans le raw à l'aide de:

Import-Module TestModule

Ou encore une fois nous pouvons instancier un objet:

$m = Import-Module TestModule -AsCustomObject

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X