Я серьезно прошу прощения за ужасное название этого поста ... но я новичок в ООП и PowerShell, поэтому я совершенно не знаю, как изложить то, что я прошу. Узнав, что я могу использовать PowerShell для подключения к API и тому подобному, я работал над этим без остановки. Сейчас я работаю над сценарием, в котором мне нужно создать класс. Я сделал это успешно, и я могу создавать методы и использовать их. На данный момент все мои объекты и методы имеют только один уровень .... Итак, если я вызываю метод объекта, он всегда выглядит так: $ 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 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
}
}
@ MathiasR.Jessen Добавлено в исходное сообщение





Определите новый класс для функций Power и вставьте токены IPAddress и Auth в новый экземпляр этого класса в конструкторе основного класса:
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)
}
}
Спасибо! В итоге я выбрал это решение. Другое решение, предоставленное Frode, также работало, но их решение отображало свойства IP и authtoken на обоих уровнях (TV и TV.Power). Мне нравится, что вы сохранили эти свойства только на корневом уровне. У меня все это написано, и он отлично работает !!! Теперь мой телевизор включается, когда включается мой Xbox One S, и выключается вместе с ним. РЖУ НЕ МОГУ.
@chadwin круто! Я бы лично выбрал комбинацию из двух FWIW. Отметьте $IPAddress и $AuthTokenhidden в VizioTV, создайте методы для их раскрытия (например, GetIPAddress() / SetIPAddress()), а затем используйте технику инъекции Frode ([VizioTVPower]::new($this))
Вы можете создать классы для Power и Input и сохранить их как свойства в вашем ТВ-классе. Не забудьте передать ссылку на родительский объект (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
Спасибо! Мне тоже понравилось ваше решение, но я остановился на другом. Мне нравится, что он сохранил свойства IPAddress и AuthToken только на корневом уровне при навигации по дереву объектов.
Это была его самая большая слабость. Значения хранятся в виде нескольких копий. С моим подходом вы можете изменить их позже в одном месте и обновлять везде. Мой подход также позволил бы классу Power получить доступ к значениям или методам в экземпляре Input ++. Выберите то, что лучше всего подходит для вас. :-)
Вы можете показать нам текущую реализацию класса?