创建一个基于关闭实例执行的方法?
Creating a method to execute based off instance?
是否有在 class 中创建一个方法来根据其中一个填充字段做某事这样的事情?有点像静态方法。
只是想创建我自己的 Ping() 方法,但是,希望它只使用已经填充的 ComputerName
属性。
Class Device {
[string]$ComputerName
[string]$Status
[string]$Manufacturer
[string]$Model
[string]$SerialNumber
[Void]Ping($ComputerName) {
$Echo_Reply = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet
$this.Status = $Echo_Reply
}
}
所以如果我实例化它,为 属性 分配一个计算机名称,我可以直接使用我的 Ping() 方法而不引用它吗?实际上 ping?
$Device = [device]::new()
$Device.ComputerName = 'ComputerOne'
我可以只使用我的方法来 ping 它吗:$Device.Ping()
,而不是引用它 $Device.Ping('ComputerOne')
。
您正在寻找实例方法,而不是静态 一个,即可以隐式操作手头 class
的实例的特定状态。
您问题中的代码定义的 是 实例方法,并且正如 mclayton 指出的那样,您必须 使用 $this.<property-name>
从实例方法 中引用实例的属性,因此您的方法可以重新定义为:
[void] Ping() {
$this.Status = Test-Connection -ComputerName $this.ComputerName -Count 1 -Quiet
}
陷阱,从 PowerShell Core 7.2.0-preview.7 开始:
如果在脚本中直接class
定义后,您尝试重新定义它后来 在同一个脚本 中通过 dot-sourcing (. <script>
),重新定义被 悄悄忽略。
- 可以说,在 相同 范围内的这种重新定义应该完全 prevented,如果你尝试在给定范围内直接重新定义相同的 class 。
- 见GitHub issue #8767
如有疑问,启动新会话以确保最新定义你的class生效.
是否有在 class 中创建一个方法来根据其中一个填充字段做某事这样的事情?有点像静态方法。
只是想创建我自己的 Ping() 方法,但是,希望它只使用已经填充的 ComputerName
属性。
Class Device {
[string]$ComputerName
[string]$Status
[string]$Manufacturer
[string]$Model
[string]$SerialNumber
[Void]Ping($ComputerName) {
$Echo_Reply = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet
$this.Status = $Echo_Reply
}
}
所以如果我实例化它,为 属性 分配一个计算机名称,我可以直接使用我的 Ping() 方法而不引用它吗?实际上 ping?
$Device = [device]::new()
$Device.ComputerName = 'ComputerOne'
我可以只使用我的方法来 ping 它吗:$Device.Ping()
,而不是引用它 $Device.Ping('ComputerOne')
。
您正在寻找实例方法,而不是静态 一个,即可以隐式操作手头
class
的实例的特定状态。您问题中的代码定义的 是 实例方法,并且正如 mclayton 指出的那样,您必须 使用
$this.<property-name>
从实例方法 中引用实例的属性,因此您的方法可以重新定义为:[void] Ping() { $this.Status = Test-Connection -ComputerName $this.ComputerName -Count 1 -Quiet }
陷阱,从 PowerShell Core 7.2.0-preview.7 开始:
如果在脚本中直接
class
定义后,您尝试重新定义它后来 在同一个脚本 中通过 dot-sourcing (. <script>
),重新定义被 悄悄忽略。- 可以说,在 相同 范围内的这种重新定义应该完全 prevented,如果你尝试在给定范围内直接重新定义相同的 class 。
- 见GitHub issue #8767
如有疑问,启动新会话以确保最新定义你的class生效.