首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Powershell。是否创建类文件来保存自定义对象?

Powershell。是否创建类文件来保存自定义对象?
EN

Stack Overflow用户
提问于 2013-09-10 03:05:42
回答 4查看 25.5K关注 0票数 20

我使用Powershell的custom-object命令保存数据点。Custom-object只创建一个对象,并为其分配一个变量。Powershell是否可以更进一步,创建可以创建对象的新类?

在下面的示例中,我存储了三部分数据:服务器名称、时间戳和自服务器上发生事件以来的分钟数。

当我学习Powershell时,我将所有这些放入一个二维数组中:

代码语言:javascript
复制
$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不能很好地处理数组,所以我开始使用一个自定义对象:

代码语言:javascript
复制
$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

这是正确的导出,并且处理对象属性比处理二维数组中的列更容易。

但是,如果我想创建几个不在数组中的自定义对象,我必须一遍又一遍地编写自定义对象代码。

代码语言:javascript
复制
$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编程语言一样吗?类似于:

代码语言:javascript
复制
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中是可能的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-10 03:46:39

您可以在PowerShell中定义类。

代码语言:javascript
复制
Add-Type -Language CSharp @"
public class Record{
    public System.DateTime TimeStamp;
    public string Server;
    public int Minutes;
}
"@;
$MyRecord = new-object Record;
$MyRecord.Server = "myserver";
$MyRecord.Timestamp = Get-Date;
$MyRecord.Minutes = 15;
票数 38
EN

Stack Overflow用户

发布于 2013-09-10 03:30:36

您可以使用函数作为自定义对象的人工构造函数。你永远不需要重复你的代码,而且你可以使用标志从函数调用中直接设置你的属性。下面是一个例子:

代码语言:javascript
复制
Function New-Constructor
{
    param
    (
        [string]$Name,
        [DateTime]$TimeStamp = (Get-Date)
    )

    $server = New-Object -TypeName PSObject
    $server | Add-Member -MemberType NoteProperty -Name Server -Value $Name
    $server | Add-Member -MemberType NoteProperty -Name TimeStamp -Value $TimeStamp

    # Calling "server" below outputs it, acting as a "return" value
    $server
}

和一些示例输出:

代码语言:javascript
复制
PS C:\> New-Constructor -Name "MyServer"

Server                                                      TimeStamp
------                                                      ---------
MyServer                                                    9/9/2013 3:27:47 PM


PS C:\> $myServer = New-Constructor -Name "MyServer"
PS C:\> $myServer

Server                                                      TimeStamp
------                                                      ---------
MyServer                                                    9/9/2013 3:27:57 PM


PS C:\> $newServer = New-Constructor -Name "NS" -TimeStamp (Get-Date).AddDays(-1)
PS C:\> $newServer

Server                                                      TimeStamp
------                                                      ---------
NS                                                          9/8/2013 3:33:00 PM

你可以用函数做一大堆事情,这超出了这个问题的范围。相反,请查看about_functions_advanced

票数 19
EN

Stack Overflow用户

发布于 2016-06-16 20:55:44

另一种选择。

属性

您可以将属性消息的'$null‘值替换为初始值。Prop对象是键(属性)和值(初始值)的哈希表。

代码语言:javascript
复制
$messageClass = New-Object -TypeName PSObject -Prop @{ message = $null; }

方法

代码语言:javascript
复制
$messageClass | Add-Member -MemberType ScriptMethod -Name "ShowMessage" -Value {

    Try
    {
        Write-Host $this.message    
    }
    Catch
    {
        Throw $_.Exception
    }
}

构造函数

下面的代码描述了一个构造函数。多态性是通过使用参数(Mandatory=$false)来断言或不断言指定参数的提供来实现的。

代码语言:javascript
复制
function MessageClass {
    param([Parameter(Mandatory=$true)]
          [String]$mandatoryMessage,
          [Parameter(Mandatory=$false)]
          [String]$optionalMessage)

    $messageObj = $messageClass.psobject.copy()

    if ($optionalMessage)
    {
        $messageObj.message = "$mandatoryMessage $optionalMessage!"
    }
    else
    {
        $messageObj.message = "$mandatoryMessage!"
    }

    $messageObj
}

然后可以像这样调用构造函数:

代码语言:javascript
复制
$var1 = 'Hello'
$var2 = 'World'
$example1 = MessageClass -mandatoryMessage $var1
$example2 = MessageClass -mandatoryMessage $var1 -optionalMessage $var2

要显示文本,请执行以下操作:

代码语言:javascript
复制
$example1.ShowMessage()
$example2.ShowMessage()

结果将是:

你好!

你好,世界!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18705158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档