Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell。创建一个类文件来保存自定义对象?_Powershell_Powershell 2.0 - Fatal编程技术网

Powershell。创建一个类文件来保存自定义对象?

Powershell。创建一个类文件来保存自定义对象?,powershell,powershell-2.0,Powershell,Powershell 2.0,我使用Powershell的自定义对象命令来保存数据点。自定义对象只创建一个对象并为其指定变量。Powershell能否更进一步,创建新的类来创建对象 在下面的示例中,我存储了三条数据:服务器名称、时间戳和服务器上发生事件后的分钟数 在学习Powershell时,我将所有这些都放入了二维数组中: $record = @("Server","Timestamp","Minutes") for ($j = 0; $j -lt 10; $j++){ $record += @("Server1"

我使用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
导出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中可能吗?

您可以使用函数作为自定义对象的假构造函数。您不必复制代码,并且可以使用标志从函数调用中设置属性。下面是一个例子:

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
}
以及一些示例输出:

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

你可以用这个问题范围之外的函数做很多事情。您可以在PowerShell中定义类

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;
另一种选择

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

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

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
}
然后可以这样调用构造函数:

$var1 = 'Hello'
$var2 = 'World'
$example1 = MessageClass -mandatoryMessage $var1
$example2 = MessageClass -mandatoryMessage $var1 -optionalMessage $var2
要显示文本,请执行以下操作:

$example1.ShowMessage()
$example2.ShowMessage()
结果将是:

你好!


你好,世界

为了获得最佳性能,我会这样做:

Add-Type -TypeDefinition '
public class recordEntry {
    public string server;
    public System.DateTime timestamp;
    public int minutes;

    public recordEntry(string _server, System.DateTime _timestamp, int _minutes) {
        server = _server;
        timestamp = _timestamp;
        minutes = _minutes;
    }
}'

$record = [System.Collections.ArrayList]@()
$record = foreach ($j in 0..10){
    [recordEntry]::new("Server1", [datetime]::Now, $j)
}
$record | export-csv -path c:\record.csv -NoTypeInformation

谢谢我从未听说过“Add Type”命令……快速阅读后,我输入了“Add Type-Langauge CSharp@”“@…双引号之间的所有内容都被编译为C#?”?就像在中一样,我可以在引号之间粘贴一个完整的C#程序,它将作为我的Powershell脚本的一部分运行?您可以在Powershell中嵌入C#。请参见如何在CSharp中添加函数/方法。使用函数是有意义的。alroc的Add Type答案可能更简洁,但如果我不懂C#,这就行了。在这两种情况下,我假设我可以将这些自定义类(无论是PS函数还是C#类)组合到一个模块中,我的团队可以将其导入他们编写的任何脚本中,对吗?@MichaelCorn Yep,你明白了。如果我想在Powershell中模拟类的方法呢?“我是怎么做到的?”AnthonyNeace说。请参阅文章:未来的读者:注意,从Powershell 5.0开始,自定义类是使用Class关键字的内置功能,它支持属性、方法、多个构造函数等,所有这些都使用典型的Powershell语法。无需学习c#或使用下面描述的各种非常巧妙的解决方法和难题。以下是关于课程页面:
$example1.ShowMessage()
$example2.ShowMessage()
Add-Type -TypeDefinition '
public class recordEntry {
    public string server;
    public System.DateTime timestamp;
    public int minutes;

    public recordEntry(string _server, System.DateTime _timestamp, int _minutes) {
        server = _server;
        timestamp = _timestamp;
        minutes = _minutes;
    }
}'

$record = [System.Collections.ArrayList]@()
$record = foreach ($j in 0..10){
    [recordEntry]::new("Server1", [datetime]::Now, $j)
}
$record | export-csv -path c:\record.csv -NoTypeInformation