Powershell Exchange脚本返回不一致的结果 – PS怪异

也许有人可以对我遇到的一些Powershell怪异点进行一些说明,而且无法解释。

这个PS脚本返回交换数据库的列表,它们的大小和每个邮箱的数量:

Get-MailboxDatabase | Select Server, StorageGroupName, Name, @{Name="Size (GB)";Expression={$objitem = (Get-MailboxDatabase $_.Identity); $path = "`\`\" + $objitem.server + "`\" + $objItem.EdbFilePath.DriveName.Remove(1).ToString() + "$"+ $objItem.EdbFilePath.PathName.Remove(0,2); $size = ((Get-ChildItem $path).length)/1048576KB; [math]::round($size, 2)}}, @{Name="Size (MB)";Expression={$objitem = (Get-MailboxDatabase $_.Identity); $path = "`\`\" + $objitem.server + "`\" + $objItem.EdbFilePath.DriveName.Remove(1).ToString() + "$"+ $objItem.EdbFilePath.PathName.Remove(0,2); $size = ((Get-ChildItem $path).length)/1024KB; [math]::round($size, 2)}}, @{Name="No. Of Mbx";expression={(Get-Mailbox -Database $_.Identity | Measure-Object).Count}} | Format-table –AutoSize 

如果我在“格式表”之前添加一个简单的“sorting名称”,则我的结果表格包含应显示数据库大小和邮箱数量的空白(不是零,空白空格),但只在某些行中,而不是所有的行。 有些行包含数字!

如果我把“|sorting名称” '最初的'get-mailboxdatabase'后它工作正常。

更奇怪的是,如果我做到以下几点:

  1. 执行上面的命令
  2. 在format-table之前添加sorting
  3. 执行新的命令
  4. 再次执行初始命令

我所看到的是三种情况中的每种情况都有不同的数量 – 所有这些都是错误的。 然而,1和3是相同的命令,与2的唯一区别是sorting。 1和3应至less返回相同的结果。 我得到空白,我应该有MBs

如果我在get-mailboxdatabase之后添加sorting,它总是返回相同的结果(它应该)。

任何人都可以提出解释,可能会发生什么?

如果有任何帮助阅读这个expression式的话,我已经在这里重新格式化了它,使它更具可读性:

 Get-MailboxDatabase | Select Server, StorageGroupName, Name, @{Name="Size (GB)";Expression={ $objitem = (Get-MailboxDatabase $_.Identity); $path = "`\`\" + $objitem.server + "`\" + $objItem.EdbFilePath.DriveName.Remove(1).ToString() + "$" + $objItem.EdbFilePath.PathName.Remove(0,2); $size = ((Get-ChildItem $path).length)/1048576KB; [math]::round($size, 2) }}, @{Name="Size (MB)";Expression={ $objitem = (Get-MailboxDatabase $_.Identity); $path = "`\`\" + $objitem.server + "`\" + $objItem.EdbFilePath.DriveName.Remove(1).ToString() + "$" + $objItem.EdbFilePath.PathName.Remove(0,2); $size = ((Get-ChildItem $path).length)/1024KB; [math]::round($size, 2) }}, @{Name="No. Of Mbx";expression={ (Get-Mailbox -Database $_.Identity | Measure-Object).Count }} | Format-table –AutoSize 

我在这里大声思考,但也许这是PowerShell 3.0 CTP2中已解决PowerShell 2.0这个已知的问题 。 我知道你不明确地调用Add-Member ,但是具有计算字段types的Select语句完成了同样的事情。 看起来他们可能是有关系的。 我跑了一些testing比较PS 2.0和3.0和3.0CTP2从来没有失败的查询。 PowerShell 2.0每次给了我不同的输出。

如果您还不能安装PS 3.0,我已经重写了脚本的一部分,但是它没有包含原始的所有列。 我会让你调整到完美。 你只需要使用Add-Member添加更多的属性。

 Get-MailboxDatabase -IncludePre | foreach-object {add-member -inputobject $_ -membertype noteproperty -name mailboxdbsizeinGB -value ([math]::Round(([int64](get-wmiobject cim_datafile -computername $_.server -filter ('name=''' + $_.edbfilepath.pathname.replace("\","\\") + '''')).filesize / 1GB),2)) ; add-member -inputobject $_ -membertype noteproperty -name mailboxdbsizeinMB -value ([math]::Round(([int64](get-wmiobject cim_datafile -computername $_.server -filter ('name=''' + $_.edbfilepath.pathname.replace("\","\\") + '''')).filesize / 1MB),2)); add-member -inputobject $_ -membertype noteproperty -name numberofMailboxes -value (($_ | Get-Mailbox | Measure-Object).Count) -PassThru} | Sort-Object mailboxdbsizeinGB -Descending | format-table identity,mailboxdbsizeinGB,mailboxdbsizeinMB,numberofMailBoxes -Autosize 

请记住,如果您安装PS 3.0,如果您在powershell.exe调用之后添加了-version 2.0参数,仍然可以启动2.0版。