相关疑难解决方法(0)

如何在 ScriptBlock 中传递 $_ ($PSItem)

我基本上是在使用运行空间构建自己的并行 foreach 管道函数。

我的问题是:我这样调用我的函数:

somePipeline | MyNewForeachFunction { scriptBlockHere } | pipelineGoesOn...
Run Code Online (Sandbox Code Playgroud)

如何将$_参数正确传递到 ScriptBlock 中?当 ScriptBlock 包含作为第一行时它起作用

param($_)
Run Code Online (Sandbox Code Playgroud)

但是,正如你可能已经注意到,在PowerShell中内置的foreach对象和地点,对象也不会需要传递给他们的每脚本块这样的参数声明。

感谢您提前回答 fjf2002

编辑:

目标是:我想让函数的用户感到舒适MyNewForeachFunction——他们不需要param($_)在他们的脚本块中写一行。

在里面MyNewForeachFunction,ScriptBlock 当前被调用通过

$PSInstance = [powershell]::Create().AddScript($ScriptBlock).AddParameter('_', $_)
$PSInstance.BeginInvoke()
Run Code Online (Sandbox Code Playgroud)

编辑2:

关键是,例如内置函数的ForEach-Object实现如何实现$_不需要在其 ScriptBlock 参数中声明为参数,我也可以使用该功能吗?

(如果答案是,它ForEach-Object是一个内置函数并使用了一些我无法使用的魔法,那么在我看来,这将使整个 PowerShell 语言失去资格)

编辑3:

感谢 mklement0,我终于可以构建我的通用 foreach 循环。这是代码:

function ForEachParallel {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory)] [ScriptBlock] $ScriptBlock,
        [Parameter(Mandatory=$false)] [int] $PoolSize = 20,
        [Parameter(ValueFromPipeline)] $PipelineObject
    )

    Begin {
        $RunspacePool = [runspacefactory]::CreateRunspacePool(1, $poolSize) …
Run Code Online (Sandbox Code Playgroud)

powershell foreach pipe powershell-sdk

4
推荐指数
1
解决办法
960
查看次数

标签 统计

foreach ×1

pipe ×1

powershell ×1

powershell-sdk ×1