类 在 Powershell 5 中,需要帮助创建 $foo.bar.run()
Classes in Powershell 5, need help creating $foo.bar.run()
对于这个可怕的标题,我深表歉意post...但我是 OOP 和 PowerShell 的新手,所以我完全不知道如何阐明我的要求。在发现我可以使用 PowerShell 连接到 API 之类的东西后,我一直在研究它 non-stop。我现在正在编写需要创建 class 的脚本。我已经成功地做到了这一点,并且能够构建方法并使用它们。截至目前,我所有的 object 和方法都只有一个级别....因此,如果我在 object 上调用方法,它总是看起来像这样 $foo.run( )
但我想创建类似 $foo.bar.run()
的东西
我写了一个使用我的电视 API 的脚本。所以目前我有这样的命令:
$tv.TurnOn()
$tv.TurnOff()
$tv.GetPowerStatus()
$tv.ListInputs()
$tv.GetCurrentInput()
$tv.SetInput($name)
但我希望能够改为这样做:
$tv.Power.On()
$tv.Power.Off()
$tv.Power.Status()
$tv.Input.List()
$tv.Input.Current()
$tv.Input.Set($name)
这可能吗?
是的,我知道可能还有其他更适合的语言。但我只是在玩耍,并将其用作实际 C# 开发的过渡语言。对我来说,将一堆脚本和参数放入文件和 运行 文件比尝试建立 C# 项目、编译和测试更容易。
这是 class 的当前代码:
Class VizioTV {
[String]$IPAddress
[String]$AuthToken
[void]TurnOn() {
Set-Power -action "on" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[void]TurnOff() {
Set-Power -action "off" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[String]GetPowerStatus() {
Return Get-PowerStatus -IPAddress $this.IPAddress -auth $this.AuthToken
}
}
为 Power
函数定义一个新的 class 并将 IPAddress 和 Auth 令牌注入主 class 的构造函数中那个 class 的新实例:
class VizioTVPower {
hidden [String]$IPAddress
hidden [String]$AuthToken
VizioTVPower([string]$IPAddress, [string]$AuthToken) {
$this.IPAddress = $IPAddress
$this.AuthToken = $AuthToken
}
[void]TurnOn() {
Set-Power -action "on" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[void]TurnOff() {
Set-Power -action "off" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[String]GetPowerStatus() {
Return Get-PowerStatus -IPAddress $this.IPAddress -auth $this.AuthToken
}
}
class VizioTV {
[String]$IPAddress
[String]$AuthToken
[VizioTVPower]$Power
VizioTV([string]$IPAddress, [string]$AuthToken) {
$this.IPAddress = $IPAddress
$this.AuthToken = $AuthToken
$this.Power = [VizioTVPower]::new($this.IPAddress, $this.AuthToken)
}
}
您可以为 Power
和 Input
创建 类 并将它们作为属性存储在您的 TV-class 中。请记住传递对父对象 (TV) 的引用,以便它们可以访问 IPAddress
和 AuthToken
值。
class VizioTVInput {
[VizioTV]$TV
VizioTVInput([VizioTV]$TV) {
#Keep reference to parent
$this.TV = $TV
}
[string[]]List() {
return "Something"
}
[string]Current() {
return "Something"
}
[void]Set([string]$name) {
#Do something with $name
}
}
class VizioTVPower {
[VizioTV]$TV
VizioTVPower([VizioTV]$TV) {
#Keep reference to parent
$this.TV = $TV
}
[void]On() {
#Remove Write-Host, just used for demo
Write-Host Set-Power -action "on" -IPAddress $this.TV.IPAddress -auth $this.TV.AuthToken
}
[void]Off() {
Set-Power -action "off" -IPAddress $this.TV.IPAddress -auth $this.TV.AuthToken
}
[String]Status() {
return Get-PowerStatus -IPAddress $this.TV.IPAddress -auth $this.TV.AuthToken
}
}
Class VizioTV {
[String]$IPAddress
[String]$AuthToken
[VizioTVInput]$Input = [VizioTVInput]::new($this)
[VizioTVPower]$Power = [VizioTVPower]::new($this)
#Made it mandatory to input IP and AuthToken. Remove constructor if not needed
VizioTV([string]$IPAddress,[string]$AuthToken) {
$this.IPAddress = $IPAddress
$this.AuthToken = $AuthToken
}
}
$TV = New-Object VizioTV -ArgumentList "127.0.0.1", "AuthKey123"
演示:
$TV.Power.On()
#Outputs
Set-Power -action on -IPAddress 127.0.0.1 -auth AuthKey123
$TV.IPAddress = "10.0.0.1"
$TV.Power.On()
#Outputs
Set-Power -action on -IPAddress 10.0.0.1 -auth AuthKey123
对于这个可怕的标题,我深表歉意post...但我是 OOP 和 PowerShell 的新手,所以我完全不知道如何阐明我的要求。在发现我可以使用 PowerShell 连接到 API 之类的东西后,我一直在研究它 non-stop。我现在正在编写需要创建 class 的脚本。我已经成功地做到了这一点,并且能够构建方法并使用它们。截至目前,我所有的 object 和方法都只有一个级别....因此,如果我在 object 上调用方法,它总是看起来像这样 $foo.run( )
但我想创建类似 $foo.bar.run()
的东西我写了一个使用我的电视 API 的脚本。所以目前我有这样的命令:
$tv.TurnOn()
$tv.TurnOff()
$tv.GetPowerStatus()
$tv.ListInputs()
$tv.GetCurrentInput()
$tv.SetInput($name)
但我希望能够改为这样做:
$tv.Power.On()
$tv.Power.Off()
$tv.Power.Status()
$tv.Input.List()
$tv.Input.Current()
$tv.Input.Set($name)
这可能吗?
是的,我知道可能还有其他更适合的语言。但我只是在玩耍,并将其用作实际 C# 开发的过渡语言。对我来说,将一堆脚本和参数放入文件和 运行 文件比尝试建立 C# 项目、编译和测试更容易。
这是 class 的当前代码:
Class VizioTV {
[String]$IPAddress
[String]$AuthToken
[void]TurnOn() {
Set-Power -action "on" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[void]TurnOff() {
Set-Power -action "off" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[String]GetPowerStatus() {
Return Get-PowerStatus -IPAddress $this.IPAddress -auth $this.AuthToken
}
}
为 Power
函数定义一个新的 class 并将 IPAddress 和 Auth 令牌注入主 class 的构造函数中那个 class 的新实例:
class VizioTVPower {
hidden [String]$IPAddress
hidden [String]$AuthToken
VizioTVPower([string]$IPAddress, [string]$AuthToken) {
$this.IPAddress = $IPAddress
$this.AuthToken = $AuthToken
}
[void]TurnOn() {
Set-Power -action "on" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[void]TurnOff() {
Set-Power -action "off" -IPAddress $this.IPAddress -auth $this.AuthToken
}
[String]GetPowerStatus() {
Return Get-PowerStatus -IPAddress $this.IPAddress -auth $this.AuthToken
}
}
class VizioTV {
[String]$IPAddress
[String]$AuthToken
[VizioTVPower]$Power
VizioTV([string]$IPAddress, [string]$AuthToken) {
$this.IPAddress = $IPAddress
$this.AuthToken = $AuthToken
$this.Power = [VizioTVPower]::new($this.IPAddress, $this.AuthToken)
}
}
您可以为 Power
和 Input
创建 类 并将它们作为属性存储在您的 TV-class 中。请记住传递对父对象 (TV) 的引用,以便它们可以访问 IPAddress
和 AuthToken
值。
class VizioTVInput {
[VizioTV]$TV
VizioTVInput([VizioTV]$TV) {
#Keep reference to parent
$this.TV = $TV
}
[string[]]List() {
return "Something"
}
[string]Current() {
return "Something"
}
[void]Set([string]$name) {
#Do something with $name
}
}
class VizioTVPower {
[VizioTV]$TV
VizioTVPower([VizioTV]$TV) {
#Keep reference to parent
$this.TV = $TV
}
[void]On() {
#Remove Write-Host, just used for demo
Write-Host Set-Power -action "on" -IPAddress $this.TV.IPAddress -auth $this.TV.AuthToken
}
[void]Off() {
Set-Power -action "off" -IPAddress $this.TV.IPAddress -auth $this.TV.AuthToken
}
[String]Status() {
return Get-PowerStatus -IPAddress $this.TV.IPAddress -auth $this.TV.AuthToken
}
}
Class VizioTV {
[String]$IPAddress
[String]$AuthToken
[VizioTVInput]$Input = [VizioTVInput]::new($this)
[VizioTVPower]$Power = [VizioTVPower]::new($this)
#Made it mandatory to input IP and AuthToken. Remove constructor if not needed
VizioTV([string]$IPAddress,[string]$AuthToken) {
$this.IPAddress = $IPAddress
$this.AuthToken = $AuthToken
}
}
$TV = New-Object VizioTV -ArgumentList "127.0.0.1", "AuthKey123"
演示:
$TV.Power.On()
#Outputs
Set-Power -action on -IPAddress 127.0.0.1 -auth AuthKey123
$TV.IPAddress = "10.0.0.1"
$TV.Power.On()
#Outputs
Set-Power -action on -IPAddress 10.0.0.1 -auth AuthKey123