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-PSSession
和 Import-PSSession
的结果邮箱对象。
当您在控制台中写入时,管道会在每个命令完成后停止,所以一旦完成,"view" 就会重置。
您可以通过以下方式解决此问题:
- 将导入行替换为
Import-PSSession $session | Out-Null
,这样就不会设置 "view"。
- 使用
Out-Host
之类的东西直接写入主机,而不是沿着管道发送邮箱。例如:Get-Mailbox | Out-Host
.
在 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-PSSession
和 Import-PSSession
的结果邮箱对象。
当您在控制台中写入时,管道会在每个命令完成后停止,所以一旦完成,"view" 就会重置。
您可以通过以下方式解决此问题:
- 将导入行替换为
Import-PSSession $session | Out-Null
,这样就不会设置 "view"。 - 使用
Out-Host
之类的东西直接写入主机,而不是沿着管道发送邮箱。例如:Get-Mailbox | Out-Host
.