Exchange:脚本与命令行

时间:2016-03-03 19:05:20

标签: powershell exchange-server

在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时,我会获得完整的邮箱详细信息。但是,当通过命令行运行时,我会得到一个邮箱列表。为什么我会得到不同的输出?我希望脚本只输出一个邮箱列表。

1 个答案:

答案 0 :(得分:1)

脚本/函数/ cmdlet中的输出(对象)在未保存时将沿管道发送。管道是一个对象流,只要你没有将它输送到另一个函数,PowerShell就会在第一个对象到达时开始将输出写入控制台/主机。

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

当您在控制台中写入时,管道在每个命令完成后停止,因此一旦完成了"视图"重置。

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

  • 将导入行替换为Import-PSSession $session | Out-Null,这样就不会设置"视图"。
  • 使用类似Out-Host的内容直接写入主机,而不是将邮箱发送到管道。例如:Get-Mailbox | Out-Host