【发布时间】:2020-06-14 19:14:00
【问题描述】:
我使用 Powershell 的自定义对象命令来保存数据点。自定义对象只创建一个对象并为其分配一个变量。 Powershell 能否更进一步,创建新的类来制作对象?
在下面的示例中,我存储了三段数据:服务器名称、时间戳和服务器上发生事件后的分钟数。
我在学习Powershell的时候,把这些都放到了一个二维数组中:
$record = @("Server","Timestamp","Minutes")
for ($j = 0; $j -lt 10; $j++){
$record += @("Server1","$(get-date)",$j)
sleep 60
}
$record | export-csv -path c:\record.csv -no type information
export-csv 不能很好地处理数组,所以我开始使用自定义对象:
$record = @()
for ($j = 0; $j -lt 10; $j++){
$r = New-Object -TypeName PSObject
$r | Add-Member -MemberType NoteProperty -Name Server -Value ""
$r | Add-Member -MemberType NoteProperty -Name Timesteamp -Value ""
$r | Add-Member -MemberType NoteProperty -Name Minutes -Value ""
$r.server = "Server1"
$r.timestamp = "$(get-date)"
$r.minutes = "$j"
$record += $r
sleep 60
}
$record | export-csv -path c:\record.csv -no type information
这是正确的导出,处理对象属性比处理二维数组中的列更容易。
但如果我想创建几个不在数组中的自定义对象,我必须一遍又一遍地编写自定义对象代码。
$server1 = New-Object -TypeName PSObject
$server1 | Add-Member -MemberType NoteProperty -Name Server -Value ""
$server1 | Add-Member -MemberType NoteProperty -Name Timesteamp -Value ""
$server2 = New-Object -TypeName PSObject
$server2 | Add-Member -MemberType NoteProperty -Name Server -Value ""
$server2 | Add-Member -MemberType NoteProperty -Name Timesteamp -Value ""
#ad nauseum
如果 Powershell 除了自定义 对象 之外还可以设计自定义 类 会怎样?像OO编程语言一样吗?比如:
class record {
-MemberType NoteProperty -Name Server -Value ""
-MemberType NoteProperty -Name Timestamp -Value ""
-MemberType NoteProperty -Name Minutes -Value ""
}
$server1 = new-object -TypeName record
$server2 = new-object -TypeName record
$server3 = new-object -TypeName record
这在 Powershell 中可行吗?
【问题讨论】:
-
未来的读者:请注意,从 Powershell 5.0 开始,自定义类是使用 Class 关键字的内置功能,它支持属性、方法、多个构造函数等,所有这些都使用典型的 powershell 语法。无需学习 c# 或使用下面描述的各种非常聪明的解决方法和工具。
-
这里是 about_Classes 页面:docs.microsoft.com/en-us/powershell/module/…