2016-03-03 59 views
2

在Powershell中,當在腳本與命令行中運行時,我從Get-Mailbox獲得不同的輸出。交換:Get-Mailbox輸出與腳本vs命令行不同

腳本:

$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-郵箱,我得到充分的郵箱詳情。但是,通過命令行運行時,我會看到郵箱列表。爲什麼我得到不同的輸出?我希望腳本輸出郵箱列表。

回答

1

腳本/函數/ cmdlet中的輸出(對象)在未保存時向管道發送。管道是一個對象流,只要你沒有將其輸出到另一個函數,PowerShell在第一個對象到達時就開始將輸出寫入控制檯/主機。

因爲這是一個流,PowerShell需要從頭開始猜測它應該如何輸出最後一個對象,並且它使用第一個對象的格式/視圖來決定,期望每個其他對象都是相同的類型。這就是爲什麼一個函數,腳本等的執行在輸出不同類型的對象時得到了一個錯誤的視圖腳本中的管道包含Import-PSSession和郵箱對象的結果。

在控制檯中寫入時,管道在每個命令完成後都會停止,因此一旦完成「視圖」復位。

您可以通過解決這個問題:

  • 替代進口,符合Import-PSSession $session | Out-Null所以這將不設置「查看」。
  • 使用類似Out-Host的東西直接寫入主機,而不是將郵箱發送到管道。例如:Get-Mailbox | Out-Host
+0

您的回答非常有幫助,並解決了我的問題。感謝您更好地瞭解PowerShell和輸出格式選項。 –

+0

很高興我能幫到你。如果這解決了您的問題,請使用答案旁邊的複選標記將其標記爲答案。歡迎來到StackOverflow –