【问题标题】:PowerShell referencing object in a pipeline管道中的 PowerShell 引用对象
【发布时间】:2019-10-17 15:15:56
【问题描述】:

我正在努力在管道中传递对象。 我一直在解决将它们转换为字符串的问题,但这并不是最有效的处理方式。

$mapi = (Get-CASMailbox -Identity $user | fl mapiEnabled | Out-String ).Split(':')[-1]
if ($mapi -match "True") {
   Set-CASMailbox -Identity $User -MAPIEnabled $false
}   

我真的很想直接访问返回的 bool 而不是将其转换为字符串

同样,我一直在使用下面做一个for 循环:

$groups = (Get-DistributionGroup | fl name | Out-String -Stream ).Replace("Name : ", "")
foreach ($group in $groups) {
    echo $group
}

这两个例子都来自 Exchange Online,下面还有一个更通用的:

if (((Get-NetIPInterface -InterfaceAlias $adapters -AddressFamily Ipv4 | fl dhcp | Out-String -Stream ).Trim() -ne "").Replace("Dhcp : ","") -match "Disabled") {
    echo disabled
}

【问题讨论】:

  • 停止使用fl(改用select,或者只是......什么都没有),你所有的问题都会消失:)
  • 为什么不直接使用(Get-CASMailbox -Identity $user).mapiEnabled?您可以使用取消引用运算符 (.) 来访问对象属性的值。 Get-CASMailbox 返回这些对象。或者只是使用@MathiasR.Jessen 建议的Select-Object 代替Format-List

标签: powershell


【解决方案1】:

我只是想花点时间看看我是否可以帮助您了解管道中正在发生的事情以及为什么@mathiasR.Jessen 和@AdminOfThings cmets 会帮助您。

$mapi = (Get-CASMailbox -Identity $user | fl mapiEnabled | Out-String ).Split(':')[-1]

分解这行代码的作用:

Get-CASMailbox 将返回一个具有多个属性的对象。 Format-List (fl) 仍将返回一个对象,但现在它已被格式化,因此它的延展性较差。 Out-String 将该格式化列表转换为单个字符串。将这些命令放在括号中会运行它们并允许您对生成的字符串对象执行方法。

使用同样的概念,我们可以使用括号执行Get-CASMailbox命令,得到你要找的单数属性:

$mapi = (Get-CASMailbox -Identity $user).mapiEnabled

现在我们已将 $mapi 设置为命令返回的 mapiEnabled 属性的值。

希望这会有所帮助!

【讨论】:

  • +1,但“仍然会返回一个对象”:它返回多个完全不相关的对象,其唯一目的是提供格式说明 到 PowerShell 的输出格式系统 - 请参阅 stackoverflow.com/a/55174715/45375。简而言之:只使用Format-* cmdlet 来格式化数据用于显示,绝不用于后续编程处理
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多