Я подозреваю, что решение, которое вы ищете, это Модули Powershell .Они выполняют роли, которые классы обычно выполняют на других языках.Они дают вам очень простой, но структурированный способ повторного использования вашего кода.
Вот как получить функциональность классов в PS с помощью модулей.В командной строке вы можете сделать это:
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}
Тогда вы сможете:
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
Как вы видите, умножение является приватным внутри модуля.В более традиционном случае вы бы инициализировали объект, который является экземпляром модуля.Это делается с помощью параметра -AsCustomObject:
$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
Тогда вы можете:
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
Все это демонстрирует использование динамических модулей, означающих, что на диске ничего не сохраняется для повторного использования.Это хорошо для очень простой функциональности.Если вы действительно хотите прочитать код и повторно использовать его в будущих сеансах или сценариях, вы должны сохранить его в файле .psm1, а затем сохранить этот файл в папке с тем же именем (за исключением расширения), что и файл.,Затем вы можете импортировать модуль в сеанс из командной строки или в другой скрипт.
В качестве примера, скажем, я взял этот код:
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
И сохранил его вфайл с именем TestModule.psm1 в папке: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ TestModule
Папка Modules в папке установки Powershell является волшебной папкой, и все хранимые там модуливидимый для командлета Import-Module без указания пути.Теперь, если мы запустим Get-Module -List
в командной строке, мы увидим:
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... {}
Мы увидим, что наш модуль готов к импорту.Мы можем импортировать его в сеанс и использовать его в необработанном виде, используя:
Import-Module TestModule
Или еще раз мы можем создать экземпляр объекта:
$m = Import-Module TestModule -AsCustomObject