微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

嵌套的 Powershell 对象取消引用

如何解决嵌套的 Powershell 对象取消引用

我目前正在为一项相对简单的任务而苦苦挣扎。

目前我想用 ForEach 对象替换通过 foreach 的迭代,因为我想启用并行化(因为大部分函数纯粹是在等待连接)。

所以

foreach ($vm in $vms)
{
   $output = Invoke-AzvmrunCommand -ResourceGroupName $vm.resourceGroup -VMName $vm.name -ScriptPath ".\script.sh" -CommandId RunShellScript -Verbose
...
   $result | Add-Member -MemberType NoteProperty "Joins" -Value "$($vm.name.tolower())$($vm.resourceGroup.tolower())$($sub.Id.tolower())"
}

会变成这样:

$vms | ForEach-Object -ThrottleLimit 5 -Parallel {
{
   $vm = $_
   $output = Invoke-AzvmrunCommand -ResourceGroupName $vm.resourceGroup -VMName $vm.name -ScriptPath ".\script.sh" -CommandId RunShellScript -Verbose
...
   $result | Add-Member -MemberType NoteProperty "Joins" -Value "$($vm.name.tolower())$($vm.resourceGroup.tolower())$($sub.Id.tolower())"
}

问题出在最终结果中,因为对这个属性的嵌套取消引用没有得到正确解析。我按它取消引用 ForEach 对象而不是指定的超类。有人知道如何正确链接它们吗?

最好的问候

€DIT: 所以既然有人问 $sub 来自哪里,这里有更多细节:

foreach ($sub in $Subscriptions)
{
...
   foreach ($vm in $vms)
   {
      $output = Invoke-AzvmrunCommand -ResourceGroupName $vm.resourceGroup -VMName $vm.name -ScriptPath ".\script.sh" -CommandId RunShellScript -Verbose
   ...
      $result | Add-Member -MemberType NoteProperty "Joins" -Value "$($vm.name.tolower())$($vm.resourceGroup.tolower())$($sub.Id.tolower())"
   }
}

解决方法

Mathias R. Jessen 在评论中提供了关键指针:

与 PowerShell 中的后台/线程作业和远程调用一样,包括来自调用者范围的变量值需要使用 $using: scope{{1} 中的 ForEach-Object }} 脚本块

由于您代码中的 -Parallel 是来自调用方作用域的变量(与块本地 $sub 变量相反,它通过表示 automatic $_ variable 接收其值管道输入在手),您需要将其值称为$vm

因此,$using:sub 必须是 $($sub.Id.tolower())

有关何时需要 $($using:sub.Id.tolower()) 及其限制的详细信息,请参阅 this answer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。