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

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

如果我在“格式表”之前添加一个简单的“排序名称”,则结果表中应显示数据库大小和邮箱数量的位置将出现空白(不是零,而是空白空间)……但只出现在部分行中,而不是所有行中。部分行包含数字!

如果我在初始“get-mailboxdatabase”之后放置“|sort name|”,它就可以正常工作。

更奇怪的是,如果我执行以下操作:

  1. 执行上述命令
  2. 在 format-table 之前添加排序
  3. 执行新命令
  4. 再次执行初始命令

我看到的三种情况的金额都不同 - 所有这些都是不正确的。然而 1 和 3 是相同的命令,与 2 的唯一区别是排序。1 和 3 至少应该返回相同的结果。我得到的是空白,而我应该有 MB

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

有人能解释一下到底发生了什么吗?

如果它对阅读表达式有任何帮助,我在这里重新格式化它以使其更具可读性:

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

答案1

我有点自言自语,但也许这与此有关已知问题使用 PowerShell 2.0 已解决PowerShell 3.0CTP2。我知道您没有明确调用Add-Member,但Select带有计算字段的语句可以完成相同的操作。它们似乎可能相关。我运行了一些测试来比较 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,则在调用-version 2.0后添加参数仍然可以启动版本 2.0 powershell.exe

相关内容