gpt4 book ai didi

powershell - 如何将 $input 自动变量转换为列表(在结束 block 中)?

转载 作者:行者123 更新时间:2023-12-02 23:17:18 24 4
gpt4 key购买 nike

显然,$inputSystem.Collections.ArrayList+ArrayListEnumeratorSimple 类型,而不仅仅是 Object[] .和[Object[]]$input失败。我想我可以手动将管道元素添加到我自己的 $input ,但是有没有更简单的方法来做到这一点?

最佳答案

  • 不使用 begin 的函数, processend block 隐含地表现得好像它的主体在 end 中。堵塞;也就是说,只有在收到所有管道输入之后,才会执行主体。
  • 在(暗示的)end block ,您可以使用 @() , array-subexpression operator$input 中收集所有管道输入 ([object[]])数组:
  • function foo {
    $allPipelineInputAsArray = @($input) # creates [object[]] array
    $allPipelineInputAsArray.ForEach({ "[$_]" }) # sample output
    }

    以上依赖 $input实现 IEnumerator 接口(interface),也就是说你也可以直接在 foreach中使用循环,例如:
    function foo {
    foreach ($obj in $input) {
    "[$obj]" # sample output.
    }
    }

    两个函数定义,当调用为 1..3 | foo ,产生以下结果:
    [1]
    [2]
    [3]

    警告 : 如果您将函数定义为 advanced (cmdlet-like) function (显式地,通过 [CmdletBinding(...)] 属性或隐式地,通过 [Parameter(...)] 属性, automatic $input variable 不再可用 - 然后您必须通过 process block 手动收集列表数据结构中的所有输入对象,然后您可以在 end block 中处理它 - 请参阅 Mathias R. Jessen's answer 中的第二个函数定义。

    另请注意,通过使用这种方法,您放弃了 PowerShell 管道的核心功能,即内存限制、输入对象的一对一处理(您正在收集内存中的所有输入对象);但是,这可能只会成为非常大的输入集的问题。

    至于 你尝试了什么 :

    [Object[]] $input



    由于 $input未实现 IEnumerable - 只有它的辅助 IEnumerator接口(interface) - 此转换不会导致枚举器 $input被步行;相反,枚举器对象本身被强制转换为 [object[]] ,这不是本意。

    换句话说: $input不是输入对象的集合,它是枚举输入对象集合的辅助对象 .

    关于powershell - 如何将 $input 自动变量转换为列表(在结束 block 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61972652/

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