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
'programing' 카테고리의 다른 글
'div'의 알려진 속성이 아니므로 'target'에 바인딩할 수 없습니다. (0) | 2023.08.21 |
---|---|
파워셸을 사용하여 바로 가기(.lnk) 파일의 대상 가져오기 (0) | 2023.08.21 |
C#의 SQL Server 데이터베이스에서 데이터를 검색하는 방법은 무엇입니까? (0) | 2023.08.21 |
스위프트 배열에서 모든 영 요소를 제거하려면 어떻게 해야 합니까? (0) | 2023.08.16 |
사용자가 필드를 비활성화하지 않고 텍스트 필드를 입력하지 못하도록 하는 방법은 무엇입니까? (0) | 2023.08.16 |