PowerShell中ForEach-Object -Parallel无法识别自定义cmdlet问题求助
问题原因
- 执行顺序异常:PowerShell脚本自上而下逐行执行,当前
hi函数定义在ForEach-Object -Parallel语句之后,执行到并行逻辑时函数还未加载到当前会话,本身就无法识别。 - 并行逻辑隔离:
ForEach-Object的-Parallel参数对应的脚本块会运行在独立的后台运行空间中,默认不会继承父会话的自定义函数、别名等配置,就算将函数移到并行逻辑之前,也会出现找不到命令的报错。
另外你提供的测试代码还存在无限递归问题:hi函数的Process块中调用了自身而非内部定义的sayHi,运行时会触发栈溢出报错。
修复方案
调整代码顺序+在并行块中导入父会话的自定义函数即可,修复后的代码如下:
# 先完成函数定义 function hi { [CmdletBinding()] Param ( [Parameter(Mandatory=$true)] [String]$name ) Begin { function sayHi { param ( [Parameter(Position=0)] $name ) Write-Host ">>>>" Write-Host "Say hi $($name)" Write-Host ">>>>" } } Process { # 修复递归问题:调用内部的sayHi而非自身 sayHi $name } End{} } 1..10 | ForEach-Object -Parallel { # 从父会话导入hi函数定义 function hi { $using:function:hi } hi $_ sleep 2 }
内容的提问来源于stack exchange,提问作者darvark
相关产品推荐
相关产品推荐

