programing

PowerShell을 사용하여 클래스를 작성할 수 있습니까?

powerit 2023. 8. 21. 21:39
반응형

PowerShell을 사용하여 클래스를 작성할 수 있습니까?

위에 PowerShell이 구축되어 있습니다.NET Framework, PowerShell을 사용하여 사용자 지정 클래스를 작성할 수 있습니까?

저는 인스턴스화에 대해 말하는 것이 아닙니다.NET 클래스...그 부분은 충분히 명백합니다.PowerShell 스크립트를 사용하여 사용자 지정 클래스를 작성하고 싶습니다.가능합니까?지금까지 제 연구는 이것이 가능하지 않다고 저를 이끌었습니다.

저는 여전히 PowerShell을 배우고 있으며, 지금까지 이 웹사이트에서 몇 번의 검색에도 불구하고 답을 찾지 못했습니다.

Add-Type cmdlet을 살펴봅니다.PowerShell에서 C# 및 기타 코드를 작성할 수 있습니다.예를 들어 (위 링크에서) PowerShell 창에서

$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);
    }
}
"@

Add-Type -TypeDefinition $source

[BasicTest]::Add(4, 3)

$basicTestObject = New-Object BasicTest
$basicTestObject.Multiply(5, 2)

당신이 찾고 있는 솔루션은 PowerShell Modules일 것입니다.클래스가 일반적으로 다른 언어로 수행하는 역할을 수행합니다.매우 간단하면서도 체계적인 코드 재사용 방법을 제공합니다.

모듈을 사용하여 PowerShell의 클래스 기능을 가져오는 방법은 다음과 같습니다.명령줄에서 다음 작업을 수행할 수 있습니다.

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 included, 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

이 모든 것은 동적 모듈의 사용을 보여줍니다. 즉, 재사용을 위해 Disk에 저장되는 것이 없습니다.이것은 매우 간단한 기능에 적합합니다.그러나 실제로 코드를 읽고 나중에 세션이나 스크립트에서 재사용하려면 .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

PowerShell 설치 폴더의 Modules 폴더는 마법 폴더이며 경로를 지정할 필요 없이 Import-Modulecmdlet에 저장된 모든 모듈이 표시됩니다.이제 우리가 뛰면,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

PowerShell 5.0에 도입된 키워드를 사용할 수 있습니다.

여기 Trevor Sullivan의 가 있습니다. (여기에 보관됨)

##################################################
####### WMF 5.0 November 2014 Preview ###########
##################################################
class Beer {
    # Property: Holds the current size of the beer.
    [Uint32] $Size;
    # Property: Holds the name of the beer's owner.
    [String] $Name;

    # Constructor: Creates a new Beer object, with the specified
    #              size and name / owner.
    Beer([UInt32] $NewSize, [String] $NewName) {
        # Set the Beer size
        $this.Size = $NewSize;
        # Set the Beer name
        $this.Name = $NewName;
    }

    # Method: Drink the specified amount of beer.
    # Parameter: $Amount = The amount of beer to drink, as an 
    #            unsigned 32-bit integer.
    [void] Drink([UInt32] $Amount) {
        try {
            $this.Size = $this.Size - $Amount;
        }
        catch {
            Write-Warning -Message 'You tried to drink more beer than was available!';
        }
    }

    # Method: BreakGlass resets the beer size to 0.
    [void] BreakGlass() {
        Write-Warning -Message 'The beer glass has been broken. Resetting size to 0.';
        $this.Size = 0;
    }
}

이 기능은 Windows 10 Pro에서 작동합니다.

다음과 같이 테스트해 보십시오.

# Create a new 33 centilitre beer, named 'Chimay'
$chimay = [Beer]::new(33, 'Chimay');

$chimay.Drink(10)
$chimay.Drink(10)

# Need more beer!
$chimay.Drink(200)

$chimay.BreakGlass()

언급URL : https://stackoverflow.com/questions/6848741/can-i-write-a-class-using-powershell

반응형