Exchange 2013 PowerShell创建自定义对象

PowerShell是一个基于对象的Shell,在写一行程序,脚本和函数时,給了我们很大的灵活性。当生成详细的报告时,我们需要从代码中自定义我们的数据输出,或者可以通过管道输送到其它的命令。我们还需要能够控制和定制代码的输出,这样我们可以合并来自多个源的数据到一个单独的对象。在这一节中,我们将学习下基本的构建定制的对象

首先我们要做的时创建一个邮箱对象的集合,将用来作为一组新的自定义对象的数据源:

$mailboxes = Get-Mailbox

可以添加自定义的属性用于后续整个管道的对象属性,如Select-Object和Format-Table

$mailboxes |

Select-Object Name,

Database,

@{name="Title";expression={(Get-User $_.Name).Title}},

@{name="Dept";expression={(Get-User $_.Name).Department}}

另外一个简单的方法就时可以分配一个哈希表的属性参数到new-Object中

$mailboxes | %{

New-Object PSObject -Property @{

Name = $_.Name

Database = $_.Database

Title = (Get-User $_.Name).Title

Dept = (Get-User $_.Name).Department

}

}

你也可以使用New-Object去创建一个新的自定义对象,然后使用Add-Member命令附上一些所属的自定义属性

$mailboxes | %{

$obj = New-Object PSObject

$obj | Add-Member NoteProperty Name $_.Name

$obj | Add-Member NoteProperty Database $_.Database

$obj | Add-Member NoteProperty Title (Get-User $_.Name).Title

$obj | Add-Member NoteProperty Dept (Get-User $_.Name).Department

Write-Output $obj

}

这三个代码示例中会输出相同的自定义对象,这里主要使用到了Get-Mailbox和Get-User命令。

自定义对象工作原理

首先,我们构建自定义对象就是为了能够合并来自多个数据源的数据到一个单一的对象中。Get-Mailbox命令不会返回绑定到一个用户的Title和Department属性,而Get-User命令需要用来检索这些信息。所以当我们想要生成一个报告,而报告的信息包括Get-Mailbox和Get-User单独用户的检索,那么我们就可以构建一个自定义的对象,用来包括所有的信息。这样我们通过管道把这些对象传递到其它命令中,用于把这些信息导出到一个文件中。

我们可以修改以上的代码示例,通过管道将结果输出到一个CSV文件中

$mailboxes |

Select-Object Name,

Database,

@{n="Title";e={(Get-User $_.Name).Title}},

@{n="Dept";e={(Get-User $_.Name).Department}} |

Export-CSV –Path C:\report.csv -NoType

看看上面的示例中运行的结果

在看看文件中的结果

CSV文件中的内容:

可以看到有些结果是不太理想???中文解决方法??导出CSV中文乱码。。。

请记住,即使你可以使用Format-Table命令去创建计算机属性,如果你想使用Select-Object,就像前面的示例能够,当讲报告信息输出到CSV文件或者HTML格式时,你会发现很多无用的数据在报告中。

在使用Select-Object构建自定义的对象时,我们可以对象中选择现有的属性,然后通过管道增加一个或多个计算属性。这是通过使用一个哈希表,在哈希表键值和脚本块中定义了一个自定义的属性名称作为哈希表的值。脚本块是一个表达式,可以运行一个或多个命令来定义自定义属性的值。我们之前的示例中,你可以看到,我们通过get-User命令去获取用户的Title和Department属性,然后把这些属性的值赋值給新的对象。

创建计算属性的语法有点类似使用名称和表达式去创建一个哈希表,你也可以缩写这些关键词,例如:

$mailboxes |

Select-Object Name,

Database,

@{n="Title";e={(Get-User $_.Name).Title}},

@{n="Dept";e={(Get-User $_.Name).Department}}

在上面的示例中,我们把Name简写为n,把Expression简写为e。使用n和e只是为了更加的方便。你也可以使用lable或l去提供属性名称。

创建一个自定义的对象,使用new-Object命令然后分配一个哈希表属性参数是一个快速和简单的方法。唯一的问题就是,这种方法可能导致返回的属性的顺序是随机的。这是因为.NET Framework分配随机数值到哈希表中,而这些属性又是基于这些值的,所以显示的顺序不是我们定义的顺序。如果你想按你需要的顺序输出,那么就需要使用管道命令Select-Object去按顺序选择属性名称。

创建一个空的自定义对象,然后手动通过Add-Member命令需要更多的输入,所以这种语法也没有广泛使用。但是当你想穿件一个脚本方法或者搅拌属性的时候,它又会很好用,这是一种高级的技术,在后续的示例中我们比较少用。

更多自定义对象命令示例

下面看看另外一种创建自定义对象的方法,这里我们使用了Select-Object命令,看看下面的示例:

$mailboxes | %{

$obj = "" | Select-Object Name,Database,Title,Dept

$obj.Name = $_.Name

$obj.Database = $_.Database

$obj.Title = (Get-User $_.Name).Title

$obj.Dept = (Get-User $_.Name).Department

Write-Output $obj

}

当心并发管道错误

在前面的示例中,变量$mailboxes存放的邮箱信息,我们都是通过PowerShell使用远程Session来处理多条命令。理想的情况下,我们只需要这样便能实现:

Get-Mailbox | %{

New-Object PSObject -Property @{

Name = $_.Name

Database = $_.Database

Title = (Get-User $_.Name).Title

Dept = (Get-User $_.Name).Department

}

}

但是不幸是,即时这个语法是完全有效的,但是它不会一直工作在Exchange Management Shell中。这是因为,当Get-Mailbox命令通过管道把对象传递給ForEach-Object时,我们也在尝试运行get-user命令去建立一个自定义的对象,远程PowerShell是不支持同时执行多个管道的。为了避免这个,我们可以使用之前的示例的方法,首先将一些结果存放在变量中,然后通过管道把变量传递給ForEach-Object。

时间: 2024-12-21 22:34:03

Exchange 2013 PowerShell创建自定义对象的相关文章

Exchange 2013 PowerShell创建自定义脚本

我们可以通过执行单条命令或者结合管道运行多条命令来完成很多任务,但是有时你想创建一个脚本,执行一系列的操作或者加载一个函数库或者预定义变量或别名在Shell中,这一节,我们将学习创建脚本以及运行脚本 怎么做呢? 1.  让我们创建一个基本的脚本,来自动执行一个多步骤的过程.启用文本编辑器,输入如下代码: param( $name, $maxsendsize, $maxreceivesize, $city, $state, $title, $department ) Set-Mailbox -Id

Exchange 2013 PowerShell创建PowerShell函数

函数是将一些列命令合并到一个可重用的代码块中,然后我们只需要调用这个函数.函数可以被配置为更改或返回一个或多个可以显示在控制台或输出到一个外部文件的对象.你可以将函数的输出传递給一个变量,或其它命令.在这一节中,我们讲学习下如何创建一个PowerShell函数 去创建一个函数,我们需要用到关键字Function,然后紧跟着就是这个函数的名称,然后函数的代码附在大括号{}中.先来看一个示例,这是一个基本的函数,将会在一个列表中显示邮箱的三个属性 function Get-MailboxList {

Exchange 2013 PowerShell新建&修改&删除邮箱

在我们日常使用Exchange Management Shell最多的应该就是邮箱的管理了.在这一节中,将主要介绍下在Exchange中使用语法命令在组织中创建.更新和删除邮箱. 先来看一个示例: 1.  我们可以使用Exchange Management Shell创建一个启用了邮箱功能的AD账户.语法如下: $password = ConvertTo-SecureString -AsPlainText abc.123 -Force New-Mailbox -UserPrincipalName

Exchange 2013 PowerShell管理联系人&通讯组&资源邮箱

管理联系人 创建联系人,使用如下语法: New-MailContact -Alias rjones ` -Name "Rob Jones" ` -ExternalEmailAddress [email protected] ` -OrganizationalUnit sales 已启用邮箱的用户可以使用如下语法: New-MailUser -Name 'John Davis' ` -Alias jdavis ` -UserPrincipalName [email protected]

Azure VMSS ---- PowerShell创建自定义镜像的VMSS集群

前面一篇文章介绍了如何用PowerShell创建标准镜像的VMSS集群.http://www.cnblogs.com/hengwei/p/7391178.html 本文将介绍,如何用PowerShell创建自定义镜像的VMSS集群. 1 创建VM,对其进行个性化配置,比如安装httpd,增加Date Disk等,并把此VM捕获成Image 2 以这个Image创建VMSS集群 一 创建并捕获Image 这个操作在前面的文章中也介绍过: http://www.cnblogs.com/hengwei

Exchange 2013 PowerShell 传输文件及并行管道

自从Exchange 2013管理Shell命令是通过远程PowerShell会话执行,导入和导出文件需要一个新的特定参数.大概有上百个Shell命令需要用到,那么这一小节,我们就看看如何使用这些参数通过远程Shell连接进行传输文件的. 传输文件工作方式: 假如你正在当前活动目录站点中创建一个边缘订阅中心到传输服务器.当你在边缘服务器上生成了xml文件后,你可以通过New-EdgeSubscription命令,具体语法如下: [byte[]]$data = Get-Content -Path

Exchange 2013 PowerShell手动配置远程PowerShell连接

介绍 在Exchange 2007的时候,微软就推出了一套全新的基于Shell的管理工具:PowerShell V1,而且所有的图形化界面也是建立在这种技术之上的. 到了Exchange 2010,PowerShell更紧密的集成在产品中,Exchange 2010使用的是PowerShell V2,很大程度上依赖于其新的远程架构.即使你的服务器在本地或云端,都可以方便的使用这套管理工具. 在Exchange 2013中,使用的是PowerShell V3,有了更多的命令以及核心功能改变.在20

Exchange 2013 PowerShell数组和哈希表

示例: 你可以使用一个变量来存放一个数组,通过这个数组对变量分配多个值,在值之间,值需要用分隔号隔开,下面来创建一个示例: $servers = "EX1","EX2","EX3" 创建一个空的哈希表,可以使用如下语法: $hashtable = @{} 创建完哈希表后,我们可以对它进行赋值: $hashtable["server1"] = 1 $hashtable["server2"] = 2 $hash

JavaScript中创建自定义对象的方法

本文内容参考JavaScript高级程序设计(第3版)第6章:面向对象的程序设计 ECMA-262中把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”我所理解的就是对象就是一个结构体,结构体中有一些它的基本属性以及对结构体处理的方法,把它们封装起来称为一个整体.JS中所有的对象都是基于一个引用类型创建,这个引用类型可以是原生类型,如Array,Date等,也可以是开发人员自定义的类型. 下面主要总结下JS中创建对象的几种模式,分析他们各自的优缺点. 1. 工厂模式 /****