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

2023-11-27

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

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

somePipeline | MyNewForeachFunction { scriptBlockHere } | pipelineGoesOn...

我怎样才能通过$_参数是否正确输入到 ScriptBlock 中?当 ScriptBlock 包含作为第一行时它起作用

param($_)

但正如您可能已经注意到的,powershell 内置的 ForEach-Object 和Where-Object 会执行以下操作:not在传递给它们的每个 ScriptBlock 中都需要这样的参数声明。

感谢您提前的答复 FJF2002

EDIT:

目标是:我希望功能用户感到舒适MyNewForeachFunction- 他们不需要写一行param($_)在他们的脚本块中。

Inside MyNewForeachFunction, ScriptBlock 当前通过以下方式调用

$PSInstance = [powershell]::Create().AddScript($ScriptBlock).AddParameter('_', $_)
$PSInstance.BeginInvoke()

EDIT2:

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

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

EDIT3:

感谢 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)
        $RunspacePool.Open()
        $Runspaces = @()
    }

    Process {
        $PSInstance = [powershell]::Create().
            AddCommand('Set-Variable').AddParameter('Name', '_').AddParameter('Value', $PipelineObject).
            AddCommand('Set-Variable').AddParameter('Name', 'ErrorActionPreference').AddParameter('Value', 'Stop').
            AddScript($ScriptBlock)

        $PSInstance.RunspacePool = $RunspacePool

        $Runspaces += New-Object PSObject -Property @{
            Instance = $PSInstance
            IAResult = $PSInstance.BeginInvoke()
            Argument = $PipelineObject
        }
    }

    End {
        while($True) {
            $completedRunspaces = @($Runspaces | where {$_.IAResult.IsCompleted})

            $completedRunspaces | foreach {
                Write-Output $_.Instance.EndInvoke($_.IAResult)
                $_.Instance.Dispose()
            }

            if($completedRunspaces.Count -eq $Runspaces.Count) {
                break
            }

            $Runspaces = @($Runspaces | where { $completedRunspaces -notcontains $_ })
            Start-Sleep -Milliseconds 250
        }

        $RunspacePool.Close()
        $RunspacePool.Dispose()
    }
}

部分代码来自 MathiasR.Jessen,为什么用于 XML 文件分析的 PowerShell 工作流明显慢于非工作流脚本


关键是要定义$_ as a variable您的脚本块可以通过调用看到Set-Variable.

这是一个简单的例子:

function MyNewForeachFunction {
  [CmdletBinding()]
  param(
    [Parameter(Mandatory)]
    [scriptblock] $ScriptBlock
    ,
    [Parameter(ValueFromPipeline)]
    $InputObject
  )

  process {
    $PSInstance = [powershell]::Create()

    # Add a call to define $_ based on the current pipeline input object
    $null = $PSInstance.
      AddCommand('Set-Variable').
        AddParameter('Name', '_').
        AddParameter('Value', $InputObject).
      AddScript($ScriptBlock)

    $PSInstance.Invoke()
  }

}

# Invoke with sample values.
1, (Get-Date) | MyNewForeachFunction { "[$_]" }

上面的结果类似于:

[1]
[10/26/2018 00:17:37]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ScriptBlock 中传递 $_ ($PSItem) 的相关文章

  • 如何在管道函数中使用 Write-Progress?

    我正在尝试编写一个函数PowerShell接受管道输入 我想使用显示进度条Write Progress 管道中每个项目的增量 例如 function Write PipelineProgress Cmdletbinding Param Pa
  • Pester 没有捕获抛出的错误

    当我运行以下纠缠测试时 我希望它能够捕获预期的错误 但事实并非如此 但是 当我使用不同的函数和不同的 throw 语句运行测试时 它会起作用 纠缠测试 Describe Remove GenericCredential Function T
  • 通过 R 中的数据子集执行计算

    我想对数据框的 PERMNO 列中的每个公司编号进行计算 其摘要可以在此处查看 gt summary companydataRETS PERMNO RET Min 10000 Min 0 971698 1st Qu 32716 1st Qu
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • Powershell v2 远程处理和委派

    我在两台机器上安装了 Powershell V2 并在两台机器上运行 Enable PsRemoting 两台机器都是Win 2003 R2 并且都加入了同一个活动目录域 我可以成功地远程运行命令 所以PS远程处理是在本地服务器和远程服务器
  • 在 C# 中创建加密随机数的最快、线程安全的方法?

    请注意 在多个线程上并行生成随机数时 加密随机数生成器不是线程安全的 使用的发电机是RNGCryptoServiceProvider它似乎重复了很长一段随机位 128 位 重现此情况的代码如下所示 缺乏使用锁来保护访问RNGCryptoSe
  • 为什么`Option`支持`IntoIterator`?

    我试图迭代字符串向量的一个子部分 即Vec
  • PowerShell:函数没有正确的返回值

    我编写了一个 powershell 脚本来比较两个文件夹的内容 Dir1 d TEMP Dir1 Dir2 d TEMP Dir2 function Test Diff Dir1 Dir2 fileList1 Get ChildItem D
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 超标量和 VLIW

    我想问一些关于ILP的问题 超标量处理器是标量处理器和矢量处理器的混合体 那么我可以说矢量处理器的架构遵循超标量吗 同时处理多个指令不会使体系结构超标量 因为流水线 多处理器或多核体系结构也可以实现这一点 这意味着什么 我读过 超标量 CP
  • Python Popen 与 psexec 挂起 - 不良结果

    我对 subprocess Popen 和我认为是管道的问题有疑问 我有以下代码块 从 cli 运行时 100 都不会出现问题 p subprocess Popen psexec serverName get cmd c ver echo
  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • 如何将一行分成多行?

    我有一个 CSV 文件 看起来像这样 Column1 Column2 Column3 John Smith AA AH CA NI PB Reginald Higginsworth AA AH CA NI PB SN ZS 您会注意到其中有
  • 仅从 AD 获取计算机名称

    我是 Power Shell 新手 正在测试一些命令和想法 我坚持认为应该很简单的事情 我想将 AD 中计算机对象的名称提取到文件中 到目前为止我正在尝试的方法是这样的 computers Get ADComputer Filter For
  • 如何使 PowerShell 函数调用超时

    我编写了一个小 powershell 函数 用于对远程服务器执行 Get EventLog 在某些服务器上 这似乎只是挂起并且永远不会超时 我可以使 powershell 函数调用超时吗 我知道如何针对不同的过程 https stackov
  • 如何使用多个字符的字符串在 PowerShell 中“拆分”字符串?

    当在 PowerShell 中的字符串上使用 Split 运算符并尝试使用包含多个字符的字符串进行拆分时 PowerShell 会表现出奇怪的行为 它使用any字符串中要分割的字符数 例如 PS C Users username gt On
  • powershell,如何获取仅给定父进程ID的子进程ID

    假设我像这样启动一个 powershell 进程 procid start process FilePath powershell ArgumentList ping t localhost 仅给出 powershell 的进程 ID 如何
  • 如何在 Powershell 中设置低 I/O(“后台”)优先级

    There s 这个powershell脚本 https stackoverflow com a 4302 1266650它可以将进程的优先级从 空闲 设置为 实时 但某些工具提供另一个优先级 该优先级甚至会降低进程的优先级 如何在 Pow
  • 并行 dask for 循环比常规循环慢?

    如果我尝试使用 dask 并行化 for 循环 它最终会比常规版本执行得慢 基本上 我只是按照 dask 教程中的介绍性示例进行操作 但由于某种原因它在我这边失败了 我究竟做错了什么 In 1 import numpy as np from
  • 错误:process_executor.py:702: ... 当一些作业被分配给执行器时,工作人员停止了。这可能是由于工作超时太短造成的

    根据主题中的错误 修复方法是什么 环境 Python 3 9 或 3 10 Windows 10 x64 使用时出现错误joblib https joblib readthedocs io en latest 对于并行处理 result c

随机推荐

  • .net 4.0 代码合同。什么时候使用?他们什么时候浪费时间了?

    我一直在研究 NET 4 0 代码契约 并在 stackoverflow 上查找与此相关的问题 我仍然从未遇到过任何使用代码契约的示例代码 这让我想知道 这真的有用吗 或者也许它是您的代码达到一定复杂性时唯一有用的一个 有人使用代码合约并且
  • 在 Wordpress 中处理序列化数据

    我在 WordPress 自定义字段中有以下序列化数据字符串 first string a 9 s 5 email s 13 email protected s 4 name s 15 Werner Etsebeth s 8 address
  • 无法从Listview的EditText获取值?

    我正在尝试从列表视图中的 EditText 获取数据 我看到了很多类似的问题并得到了solution 但它在我的实现中引发了 NPE 所以请指导我解决这个问题 Adapter public class Coscho adapter exte
  • Visual Studio Code - 可以对 python 进行实时 linting 吗?

    这里有同样的问题 但还没有任何答复 使用 VSCode 对 Python 进行实时 linting 我现在正在使用 VS code 市场上的 Python 扩展 经过大约一个小时的研究 我在 linter 中发现了以下选项 python l
  • 如何在 Eclipse 中将源附加到 Google Drive API 或“Android Private Library”

    我已经安装了驱动API使用Add Google APIs 菜单选项 当手动钻入下面的任何一个罐子时驱动API 源代码打开正常 但手动钻入同一个罐子下Android Private Libraries结果是 未找到源 所以使用时open De
  • 同名的变量和函数在块内返回错误

    如果我们声明一个变量和一个同名的函数 它接受重新声明 但是当我们在一个块内做同样的事情时 它显示重新声明错误 Code var x function x no error 但在这种情况下我收到错误 var inside re declara
  • Nightwatch 无法通过 css id 或类选择器定位元素

    我们使用 Nightwatch 来自动化一些 UI 测试 当前的一些测试相当脆弱 主要与奇怪的 CSS 选择器有关 我正在尝试简化它们 但我希望一些简单的 CSS 选择器能够工作 但事实并非如此 我试图找到这个深度嵌套的 a tag a c
  • Emacs 桌面不记得 TRAMP 连接?

    我使用 emacs 在多个不同的服务器上编辑脚本和代码文件 TRAMP 运行良好 然而 当我退出 emacs 时 我所有的流浪者连接都会消失 我尝试了桌面保存模式 但重新启动 emacs 时仅显示本地文件 是否有一些软件包可以记住流浪者连接
  • 字符串作为 R 中的因子

    在 R 中创建数据框时 字符串默认转换为因子 我不介意 但是 当我想在数据框中创建新行时 我找不到将字符串编码为因子的方法 如果我使用factor 字符串被转换为数字 但仍然不是一个因子 在任何一种情况下 我都无法将新行附加到数据框中 因为
  • jquery菜单悬停

    我有一个菜单 当我将鼠标悬停在 div 上时它会显示 当鼠标移出时它会淡出 问题是 如果您滚动菜单的任何子菜单 菜单就会消失 因为从技术上讲 如果您在其中一个子菜单上 那么您就没有在父菜单上 是否有一种方法可以使滚动子菜单不会消失算作鼠标移
  • 为什么Icecast2不想通过https给出流?

    在具有 Ubuntu 14 04 LTS 的服务器上安装了支持 SSL 的 Icecast2 2 4 1 也在该服务器上运行 HTTPS 网站 我想在页面上插入 HTML5 播放器 该播放器也将通过 SSL 获取流 否则 混合内容错误 该网
  • rgba() 的颜色 IE 后备不起作用

    为什么 IE 有以下后备color red 行不通 在IE7中 颜色是black而不是red 现场演示在这里 HTML div span Hello span div CSS div width 200px height 100px bac
  • 如何编写键盘快捷键以从选定的表中选择前 1000 个*?

    有没有办法在 ssms 2012 中创建键盘快捷键 按下时会产生与select top 1000 from mytable 我已经探索过这一点 http msdn microsoft com en us library ms174178 很
  • 定位服务在 iOS 11 中不工作

    我刚刚使用 iOS 11 SDK 重建了我的应用程序 试图删除blue banner现在总是出现 我想 太棒了 这有效 却发现定位服务现在根本不起作用 该应用程序曾经在 iOS 10 上运行 有人听说过什么吗 看来苹果又增加了一项隐私功能
  • 以编程方式创建时椭圆形被剪裁

    我有一个剪辑问题 首先 我尝试仅使用 Xml 显示椭圆形 我有以下代码 res drawable circle xml
  • 具有偶数个 0 和 1 的字符串的正则表达式

    包含偶数个 0 和偶数个 1 的 0 和 1 字符串的正则表达式是什么 我有类似的东西 1 01 01 0 10 10 看起来不错吗 好吧 这可能是家庭作业 但到底是什么 00 11 01 10 00 11 01 10 编辑 简化
  • Windows 下 Python 3 的 open() 的默认编码。不遵守 sys.getdefaultencoding() 设置

    我已经为这个问题绞尽脑汁好几个小时了 我有一个消息文件 我想使用 django 的 makemessages 命令生成 该命令在 Linux 环境中运行得很好 它实际上以合理的方式处理区域设置 然而 当我在 Windows 下尝试同样的事情
  • REST - Web 服务响应 - mime 类型?

    1 为 Web 服务响应设置正确的 MIME 类型重要吗 2 正确的哑剧类型是什么 a XML 响应 b JSON 响应 application xml text xml application json application x jav
  • Laravel 4 路由参数数量不受限制

    我正在尝试为无限数量的 URL 级别创建动态路由 这是我当前的路线 Route get pageLink array uses gt SiteController getPage 这适用于第一级 所以像something com foo 这
  • 如何在 ScriptBlock 中传递 $_ ($PSItem)

    我基本上是使用运行空间构建自己的并行 foreach 管道函数 我的问题是 我这样调用我的函数 somePipeline MyNewForeachFunction scriptBlockHere pipelineGoesOn 我怎样才能通过