在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时,我会获得完整的邮箱详细信息。但是,当通过命令行运行时,我会得到一个邮箱列表。为什么我会得到不同的输出?我希望脚本只输出一个邮箱列表。
答案 0 :(得分:1)
脚本/函数/ cmdlet中的输出(对象)在未保存时将沿管道发送。管道是一个对象流,只要你没有将它输送到另一个函数,PowerShell就会在第一个对象到达时开始将输出写入控制台/主机。
因为这是一个流,所以PowerShell需要从一开始就猜测它应该如何输出最后一个对象,并且它使用第一个对象的格式/视图来决定,期望每个其他对象都是相同的类型。这就是为什么函数,脚本等的执行在输出不同类型的对象时会断开视图。脚本中的管道包含Import-PSSession
的结果和邮箱对象
当您在控制台中写入时,管道在每个命令完成后停止,因此一旦完成了"视图"重置。
您可以通过以下方式解决此问题:
Import-PSSession $session | Out-Null
,这样就不会设置"视图"。Out-Host
的内容直接写入主机,而不是将邮箱发送到管道。例如:Get-Mailbox | Out-Host
。