gpt4 book ai didi

powershell - |之间的差异和 $

转载 作者:行者123 更新时间:2023-12-03 16:50:18 25 4
gpt4 key购买 nike

任何人都可以向我解释一下我在使用 | 将一个命令传递给另一个命令或使用 $ 以不同方式“传递”它时看到的区别(抱歉不确定使用 $ 是否真的在考虑管道)。

所以……这是可行的:

Get-Mailbox -ResultSize Unlimited | 
where { $_.RecipientTypeDetails.tostring() -eq "SharedMailbox" } |
Get-MailboxPermission

这很好,但是因为我想在 Get-MailboxPermission 之后放置另一个 where 命令,它在上面不起作用,然后我尝试使用它:

$Mailbox = Get-Mailbox -ResultSize Unlimited | 
where { $_.RecipientTypeDetails.tostring() -eq "SharedMailbox" }

Get-MailboxStatistics -Identity $Mailbox |
where { $_.IsInherited.tostring() -eq "False" }

它导致我得到这个错误:

Cannot process argument transformation on parameter 'Identity'. Cannot convert the "System.Collections.ArrayList" value of type "System.Collections.ArrayList" to type "Microsoft.Exchange.Configuration.Tasks.GeneralMailboxOrMailUserIdParameter".

肯定使用 |$ 是相同的,因为它将结果通过管道传递给下一个命令,还是我完全错了?

最佳答案

我这里没有要测试的 exchange shell,但我想我仍然可以解释基础知识并为您指明正确的方向。

管道 | 用于将输出从一个命令重定向到另一个命令。 Powershell 中的 $ 是定义它后面的字符序列是变量的字符(例如 $Mailbox 作为普通变量的示例或 $_ 作为一个变量的示例,该变量保存从上一个命令通过管道传输的数据)或表达式。一个表达式的例子是 $(4+5)
或者在一个更常用的例子中:

PS C:\Users\Administrator> $file = (get-childitem)[0]
PS C:\Users\Administrator> write-output "The fullname of $file is $($file.fullname)"
The fullname of .ssh is C:\Users\Administrator\.ssh

在该示例中,实际上有必要使用表达式,因为字符串中的变量检测不会将点识别为变量和变量成员之间的分隔符(fullname 的成员$文件).
如果您不清楚为什么有一个点以及成员是什么,您可能应该稍微研究一下面向对象编程,因为 Powershell 是彻头彻尾的面向对象。

在您的第二个示例中,您只需将 Get-Mailbox 命令返回的所有内容保存在 $Mailbox 变量中。 $Mailbox 变量可用,只要您不删除它或离开它的范围(在本例中为 powershell session )。实际上,您可以将变量用作多个命令的输入而不会丢失其数据。
使用管道时,第一个命令返回的数据只能由管道后面的命令访问,之后它就消失了。
这可能是您感兴趣的区别。

至于您的实际问题:Powershell 告诉您它不希望收到 System.Collections.ArrayList 类型的变量,这就是 Get -邮箱 返回。 technet 帮助不清楚 Get-Mailbox 具体返回什么,但我强烈猜测它是 Mailbox-Objects 的 ArrayList。你可以这样检查:

$Mailbox.GetType()
$Mailbox[0].GetType() # gets the type of the first object in $Mailbox

要修复您的代码,您需要遍历 Get-Mailbox 返回的内容。试试这个:

$Mailboxes = Get-Mailbox -ResultSize Unlimited | where { $_.RecipientTypeDetails.tostring() -eq "SharedMailbox" }
$Mailboxes | ForEach-Object { Get-MailboxStatistics -Identity $_ }

ForEach-Object cmdlet 遍历数组或列表并单独处理每个项目。
你的第一个例子到目前为止有效,因为 Powershell has been made smarter about piped data a few versions ago (请参阅有关“成员枚举”的段落)。它实际上是对传入的数据进行 ForEach 处理。

跟进链接:
The $_ variable in powershell
Powershell is an object oriented language

关于powershell - |之间的差异和 $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36888349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com