PowerShell 在 ForEach-Object -Parallel 中使用 UDF [重复]

2024-01-17

当并行处于活动状态时,我在 ForEach-Object 内使用用户定义函数时遇到一些困难:

function Add([Int]$number) {
    Write-Output "Run for $number"
}

1..4 | ForEach-Object -Parallel {
    Add -number $_
}

我收到一条错误消息:

术语“添加”不被识别为 cmdlet、函数、 脚本文件,或可执行程序。检查姓名的拼写,或者 如果包含路径,请验证该路径是否正确,然后重试。

我相信在内部使用 UDF 是一种常见的主动行为foreach环形。你有什么解决方法吗? $using: 仅适用于变量,不适用于函数,对吧?


您可以在范围内定义该函数平行块(运行空间):

1..4 | ForEach-Object -Parallel {
    function Add([Int]$number) {
        Write-Output "Run for $number"
    }
    
    Add -number $_
}

或者存储函数的定义,然后将其传递到您的函数的范围平行块 and 点源它 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7.2#dot-sourcing-operator-:

function Add([Int]$number) {
    Write-Output "Run for $number"
}

$def = "function Add { ${function:Add} }"

1..4 | ForEach-Object -Parallel {
    . ([scriptblock]::Create($using:def))
    Add -number $_
}

Linked mklement0 的有用答案 https://stackoverflow.com/questions/61273189/how-to-pass-a-custom-function-inside-a-foreach-object-parallel显示了在并行范围内定义函数的更清晰的替代方案。强烈推荐这个方法,更容易阅读和理解:

function Add([Int]$number) {
    Write-Output "Run for $number"
}

$def = ${function:Add}.ToString()

1..4 | ForEach-Object -Parallel {
    $function:Add = $using:Def
    Add -number $_
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell 在 ForEach-Object -Parallel 中使用 UDF [重复] 的相关文章

  • Chocolatey 无法使用 PowerShell cmdlet

    所以 我开始使用巧克力了 但是 我注意到 cmdlet 不起作用 例如 如果尝试使用 choco 命令执行任何操作 前任 choco install vlc 它工作得很好 但是 如果我尝试使用旧的 cmdlet 前任 Install Pac
  • 在 powershell 中打开 Excel 时出错

    我需要用以下命令打开 Excel 文件CorruptLoad来自 powershell 脚本的参数 但是当我尝试做到这一点时 出现错误Exception calling Open with 15 argument s open method
  • 如何将哈希表添加到多维数组?无法通过成员访问枚举分配值

    我在将哈希表添加到多维数组时遇到问题 我编码如下 Data BIBs BIB BIBName BIBName Standort Standort B cher BuchName BuchName Autor Autor 此代码正在运行并创建
  • 仅从 AD 获取计算机名称

    我是 Power Shell 新手 正在测试一些命令和想法 我坚持认为应该很简单的事情 我想将 AD 中计算机对象的名称提取到文件中 到目前为止我正在尝试的方法是这样的 computers Get ADComputer Filter For
  • 克服 Active Directory 1000 条记录的限制

    PowerShell 能够提取 1492 条记录的列表 当我使用带有 ldap3 模块的 Python 时 我遇到了 1000 条记录的限制 请帮我更改Python代码以超出限制 PowerShell 输入 get aduser filte
  • 如何使用多个字符的字符串在 PowerShell 中“拆分”字符串?

    当在 PowerShell 中的字符串上使用 Split 运算符并尝试使用包含多个字符的字符串进行拆分时 PowerShell 会表现出奇怪的行为 它使用any字符串中要分割的字符数 例如 PS C Users username gt On
  • 使用powershell获取快捷方式(.lnk)文件的目标

    我有一堆 lnk 文件 需要根据快捷方式指向的目标对它们进行不同的处理 我发现很少有关于如何使用其他语言执行此操作的信息 但没有找到有关使用 powershell 执行此操作的信息 我试过这个 sh New Object COM WScri
  • 具有特殊AssignableScopes的Azure自定义RM角色定义

    我正在尝试创建一个自定义 Azure RM 角色定义 其范围适用于一个订阅内的某些资源组 我不想提供对所有订阅或仅一个资源组的访问权限 并且我无法指定资源组列表 因为其中一些资源组尚未创建 我只想提供订阅资源组的某些子集的访问权限 为此 我
  • 运行多个 powershell 命令

    我如何运行前导命令 例如set adserversettings当我在 C 中调用 powershell 命令时 现在它返回 0 个结果 这是我正在使用的代码 Command command1 new Command set adserve
  • 使用 Powershell 或 C# 获取 Azure“文件和文件夹”作业状态

    我一直在尝试找到一种方法来获取在 AzureRM 中运行的几个客户上运行的 文件和文件夹 备份作业的状态 可以在 AzureRm 门户中手动找到状态 恢复服务保管库 gt 作业 gt 备份作业 使用powershell不显示任何作业信息 G
  • PowerShell,使用 Start-Job 和 Start-Process 测试异步任务的性能/效率

    我很想测试 PowerShell 中异步任务的性能 有用性Start ThreadJob Start Job and Start Process 我有一个包含大约 100 个 zip 文件的文件夹 因此进行了以下测试 New Item 00
  • 如何使用 PowerShell 捕获全局击键?

    Powershell 可以监听并捕获按键吗 是否可以编写一个 PowerShell 脚本 例如自动热键 https www autohotkey com 位于托盘中并等待您按下预定义的键盘键才开始执行 并且每次按下所述键时可能不会返回而是触
  • 使用 PowerShell 批量复制和重命名文件

    我正在尝试使用 PowerShell 批量复制和重命名文件 原始文件名为AAA001A jpg AAB002A jpg AAB003A jpg等 我想用新名称复制文件 方法是从文件名中删除前四个字符以及句点之前的字符 以便复制的文件被命名为
  • 如何在Powershell控制台中分配多行字符串

    当我在 powershell 控制台中输入此内容时 test Test Test 并且输入多次 它会一直打印 gt gt 所以我永远无法完成命令 该怎么办 应该是行中的第一件事 或者它被认为只是字符串的一部分 test Test Test
  • 在 C# 中编写批处理脚本的好方法是什么?

    我想用 C 编写简单的脚本 我通常会使用 bat 或 4NT btm 文件 复制文件 解析文本 询问用户输入等等 相当简单 但在批处理文件中正确执行这些操作确实很困难 例如没有例外 我熟悉像 AxScript 这样的命令行 脚本 包装器 这
  • Powershell 中的反斜杠

    为什么 split 参数的字符串需要两个反斜杠 而 join 参数的字符串只需要一个反斜杠 反引号是 Powershell 中的转义字符 字符前面的反斜杠有什么作用 path C folder test unit1 testing resu
  • 使用 PowerShell 修改 Visual Studio 解决方案和项目文件

    我们目前正在重新组织源代码 将内容移动到新目录中 结构 这会影响我们的 Visual Studio 解决方案和项目文件 其中诸如程序集引用 可能的输出目录 构建前和构建后事件等 必须更新以反映我们的更改 由于我们有许多解决方案和项目 我希望
  • 禁止非 PowerShell 命令的输出?

    我正在运行命令 hg st 然后检查它是 LASTEXITCODE检查当前目录中 Mercurial 的可用性 我不关心它的输出 也不想将它展示给我的用户 如何抑制所有输出 成功或错误 由于 Mercurial 不是 PowerShell
  • 无法在 cmd 中通过管道传递 cmdlet 对象

    我正在使用这个 powershell 命令来获取特定的用户配置文件 获取 WmiObject Class Win32 UserProfile Where Object LocalPath eq C Users Pela 但是当我通过调用 p
  • “Microsoft.AspNet.Server.Kestrel”不包含适合入口点的静态“Main”方法

    我正在尝试运行最新的Asp Net 5 个示例 https github com aspnet Home 当前为 1 0 0 rc1 update1 来自 Windows 10 上的 powershell 我将活动和默认 DNX 设置为 C

随机推荐