也许有人可以解释一下我遇到的但无法解释的 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|”,它就可以正常工作。
更奇怪的是,如果我执行以下操作:
- 执行上述命令
- 在 format-table 之前添加排序
- 执行新命令
- 再次执行初始命令
我看到的三种情况的金额都不同 - 所有这些都是不正确的。然而 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
。