Exchange:脚本与命令行中的 Get-Mailbox 输出不同

Exchange: Get-Mailbox output different in script vs command-line

在 Powershell 中,当 运行 在脚本中与在命令行中时,我从 Get-Mailbox 得到不同的输出。

脚本:

$credy = get-credential

$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $credy -Authentication Basic –AllowRedirection

Import-PSSession $session

Get-Mailbox

输出-脚本:

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.0        ...                                 {Add-AvailabilityAddressSpace, Add-DistributionGroupMember...

RunspaceId                             : ...
Database                               : ...
MailboxProvisioningConstraint          :
MessageCopyForSentAsEnabled            : False
MessageCopyForSendOnBehalfEnabled      : False
MailboxProvisioningPreferences         : {}
UseDatabaseRetentionDefaults           : False
RetainDeletedItemsUntilBackup          : False

输出 - 命令行:

PS C:\> Get-Mailbox

Name                      Alias                ServerName           ProhibitSendQuota
----                      -----                ----------           -----------------
mailbox1                  mb1                  ...                  ... 
mailbox2                  mb2                  ...                  ...
mailbox3                  mb3                  ...                  ...

当在脚本中 运行 Get-Mailbox 时,我得到了完整的邮箱详细信息。但是,当通过命令行 运行 时,我会得到一个邮箱列表。为什么我得到不同的输出?我希望脚本只输出邮箱列表。

来自 script/function/cmdlet 的输出(对象)在未保存时沿管道发送。管道是一个对象流,PowerShell 会在第一个对象到达后立即将输出写入 console/host,只要您不将其通过管道传输到另一个函数即可。

因为这是一个流,PowerShell 需要从一开始就猜测它应该如何输出最后一个对象,它使用第一个对象的 format/view 来决定,期望每个其他对象都是相同的类型.这就是为什么函数、脚本等的执行在输出不同类型的对象时会出现损坏的视图 脚本中的管道包含 Import-PSSessionImport-PSSession 的结果邮箱对象。

当您在控制台中写入时,管道会在每个命令完成后停止,所以一旦完成,"view" 就会重置。

您可以通过以下方式解决此问题:

  • 将导入行替换为 Import-PSSession $session | Out-Null,这样就不会设置 "view"。
  • 使用 Out-Host 之类的东西直接写入主机,而不是沿着管道发送邮箱。例如:Get-Mailbox | Out-Host.