使用 Start-Job 时本地函数调用不起作用

2023-11-30

       function F2([String]$var2)
        {
         .........
         .........
        }

       function F1([String]$var1)
        {
         .........
         F2 $var2
         .........
        }

       ..................
       ..................

      while ($i -le $count)
       {
        F1 "dir$i"
        Start-Job -ScriptBlock ${function:F1} -ArgumentList @($i)
        $i = $i + 1
       }

在下面的代码片段中,我想启动一项作业并为 while 循环的每次迭代运行 F1。尽管 F1 中定义的内容工作正常,但当通过 ScriptBlock 完成时,F1 对 F2 的调用似乎无法完成。

我在这里缺少什么吗?

UPDATE 1

我尝试实现您的建议,以实现相当简单和直接的目标,即使用作业同时在目录中创建文件。

$dirname = "E:\TEST3\dir_"
$filename = "file_"
$i=1

$moduledef = {
function makeFiles([String]$dirname)
 {
  for ($i -le 5000)
   {
    echo "WASSSUP !!" >> "$dirnaname\$filename$i.txt" 
    $i++ 
   }
 }

function makeDir([String]$dirname)
 {
    mkdir "$dirname$i"
    makeFiles "$dirname$i"
    $i++ 
 }

} # END OF $moduledef

New-Module -Name MyFunctions -ScriptBlock $moduledef

while($i -le 10)
 {  
  Start-Job -ScriptBlock { 
    param([String]$jobArg)
    New-Module -Name MyFunctions -ScriptBlock $Using:moduledef
    makeDir $jobArg
    } -ArgumentList @("$dirname$i")
  $i++
 }
Get-Job | Wait-Job 

这里的问题是作业失败了(我已将其中一个粘贴在下面),知道我在这里做错了什么吗?

HasMoreData   : True
StatusMessage : 
Location      : localhost
Command       :  
                    param([String]$jobArg)
                    New-Module -Name MyFunctions -ScriptBlock $Using:moduledef
                    makeDir $jobArg

JobStateInfo  : Failed
Finished      : System.Threading.ManualResetEvent
InstanceId    : e79a6489-cad3-47a6-b6f4-8a207d32c187
Id            : 79
Name          : Job79
ChildJobs     : {Job80}
PSBeginTime   : 4/14/2018 9:52:01 PM
PSEndTime     : 4/14/2018 9:52:02 PM
PSJobTypeName : BackgroundJob
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
Information   : {}
State         : Failed

UPDATE 2

我包含了一个接收作业,这只是错误的一部分。我正在尝试解决这个问题,但将其粘贴在这里希望您能帮助我。

PSPath            : Microsoft.PowerShell.Core\FileSystem::E:\TEST3\dir10
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::E:\TEST3
PSChildName       : dir10
PSDrive           : E
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : True
Mode              : d-----
BaseName          : dir10
Target            : {}
LinkType          : 
RunspaceId        : 434aa380-b888-4ca5-897e-75a88e1f6560
Name              : dir10
FullName          : E:\TEST3\dir10
Parent            : TEST3
Exists            : True
Root              : E:\
Extension         : 
CreationTime      : 4/14/2018 9:29:12 PM
CreationTimeUtc   : 4/14/2018 3:59:12 PM
LastAccessTime    : 4/14/2018 9:29:12 PM
LastAccessTimeUtc : 4/14/2018 3:59:12 PM
LastWriteTime     : 4/14/2018 9:29:12 PM
LastWriteTimeUtc  : 4/14/2018 3:59:12 PM
Attributes        : Directory

The term 'makeFiles' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    + CategoryInfo          : ObjectNotFound: (makeFiles:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
    + PSComputerName        : localhost

Cannot bind parameter 'ScriptBlock'. Cannot convert the "
function makeFiles([String]$dirname)
 {
  for ($i -le 5000)
   {
    echo "WASSSUP !!" >> "$dirnaname\$filename$i.txt" 
    $i++ 
   }
 }
function makeDir([String]$dirname)

Start-Job 的作用是在后端创建一个单独的线程,在线程中初始化另一个默认的 Powershell 会话,并运行通过参数 -ScriptBlock 传入的命令。

新线程中的会话是一个新会话,它没有加载任何非默认模块、变量或函数。它有自己的变量范围和生命周期。所以我不确定是否可以让它使用默认会话中定义的函数,但至少我认为这并不容易。

我可以提供的一种解决方法是使用参数 -InitializationScript 定义函数 F2 ,如下所示

       function F1([String]$var1)
        {
         .........
         F2 $var2
         .........
        }

       ..................
       ..................

      while ($i -le $count)
       {
        F1 "dir$i"
        Start-Job -ScriptBlock ${function:F1} -ArgumentList @($i) -InitializationScript {function F2([String]$var2){.........}}
        $i = $i + 1
       }

或者,如果您必须定义多个函数(例如 F1),需要调用 F2 并希望以某种方式重用 F2 定义的代码。我们可以为F2创建一个ScriptBlock对象

       $InitializationScript = [ScriptBlock]::Create('function F2([String]$var2){.........}')

       function F1([String]$var1)
        {
         .........
         F2 $var2
         .........
        }

       ..................
       ..................

      while ($i -le $count)
       {
        F1 "dir$i"
        Start-Job -ScriptBlock ${function:F1} -ArgumentList @($i) -InitializationScript $InitializationScript
        $i = $i + 1
       }

此致,

Dong

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

使用 Start-Job 时本地函数调用不起作用 的相关文章

随机推荐

  • 为什么正则表达式要用正斜杠括起来

    我正在深入研究正则表达式 subject abcdef pattern def preg match pattern substr subject 3 matches PREG OFFSET CAPTURE print r matches
  • 我可以安全地删除 Xcode Derived 数据文件夹的内容吗?

    我的磁盘空间不足 并通过第三方实用程序检查到 Library Developer Xcode DerivedData 目录占用了大约 22GB 的磁盘空间 我搜索了 stackoverflow 并找到了这篇文章 如何安全地删除 Librar
  • 使用一次“plot”调用绘制多条曲线时的一个图例条目

    我正在通过使用一条曲线绘制几条曲线来创建一个网格plot调用为 import matplotlib pyplot as plt import numpy as np fig ax plt subplots x np array 0 1 0
  • 输入丢失src

    如果我使用以下没有 runat server 的代码 输入的 src 工作正常 并且我看到图像通过 div div
  • 如何使用 Ant Design 创建问卷类型表单?

    Ant Design 提供了一个动态表单项 通过使用它 我可以添加和删除多个字段 但现在我想嵌套其中 即我想创建一个类似调查表的表单 在其中我想添加多个问题及其各自的答案 目前 当我添加问题时 它工作正常 但当我添加一个问题的答案时 它也会
  • 如何多次运行 pytest 方法?

    我正在尝试使用 pytest repeat 多次运行 pytest 方法 但我收到警告并且仅运行一次 from page to run login import RegisterLogin from utilites testStatus
  • 如何等到 Javascript forEach 循环完成后再继续下一步

    我需要等待 forEach 循环调用的函数中的所有 axios 调用运行 然后再调用另一个函数来重新加载应由 axios 调用更新的数据 function1 let arr 1 2 3 4 5 arr forEach num gt func
  • 线程过多异常

    我在黑莓开发中遇到问题 在我的应用程序中 我必须从服务器获取图像 因此我必须为从服务器加载的每个图像创建一个单独的连接线程 但是这样做时我得到 TooManyThreadsException 有关控制线程的任何想法 在黑莓中 应用程序最多可
  • Magento paypal 货币错误

    我使用牙买加货币作为我的 magento 购物车 并且我使用 paypal 快速结帐和网站支付标准 我在管理面板中设置了货币 并且贝宝设置等也完成了 我的问题是 当我单击 使用 PayPal 结帐 按钮时 出现以下错误 PayPal 网关已
  • 爆发日期从每年到每月

    我有年度每股账面价值 基点 需要将数据分解为每月的时间序列 我想加入每月价格系列来计算每月预定价格 P B 我的每月数据如下 dput below date bps 2012 06 29 2 44376 2013 06 28 1 73054
  • 使用“键盘”在失焦时打开新窗口

    我正在尝试使用模块 键盘 来跟踪我的按键 而 PySide2 小部件未处于焦点状态 效果很好 但是 当我尝试使用 键盘 快捷方式创建新的小部件时 程序崩溃了 按下按钮打开一个窗口效果很好 我还可以使用 键盘 调用非 UI 功能 例如 打印功
  • 如何在jquery中添加id?

    我在 jquery 中创建了一个对话框 还有一个按钮叫做 保存 我需要给这个保存按钮添加一个id 我怎样才能在 jquery 中实现这一点 这是我的代码 function dialog dialog height 400 width 650
  • Rails 如何正确“更新”多列 - (updated_at 也应该更新)

    我在使用 Rails activerecords 正确更新多个列时遇到问题 我想使用诸如 update 之类的东西 它基本上会在更新时更新 但我只是无法传递多个列 我可以使用 update all 但它不会使用当前时间戳更新 Updated
  • LINQ 不同查询

    我有一个 C 应用程序 它加载称为 任务 的 CLR 对象列表 每个任务都具有以下属性 public int ID get set public int TypeID get set public string TypeName get s
  • 如何在 PowerShell 中隐藏 Get-Help 中的参数(不仅仅是制表符完成)?

    我四处搜寻 找不到 否 的直接答案 但也没有找到 是 的直接答案 我已经知道的 Parameter DontShow 只影响制表符完成 一个建议是使用通用参数并测试它是否存在于 PSBoundParameters 虽然技术上可行 但它的副作
  • ES6 javascript类继承,为什么我们需要从派生类调用super()

    在 javascript ES6 中 在继承中 如果派生类有构造函数 为什么必须从派生构造函数调用 super 一些失败的例子是 带有构造函数的基类 但派生类不调用超级类 class Base constructor class Deriv
  • 如何让Xcode 3.2.3构建特定的架构?

    包含静态库时出现以下错误 缺少所需的架构 i386 文件 这在 30 秒前有效 只有当我升级到 Xcode 3 2 3 时才失败 我使用 file 命令进行检查 是的 XCode 正在构建完全错误的架构 armv6 armv7 而 不是 i
  • 如何在 NopCommerce 中实施操作过滤器

    我想更改 CheckoutController 中 OpcSaveBilling 操作的操作中的一些代码 我不想改变 NopCommerce 的核心代码 所以我需要尝试用我自己的自定义代码覆盖代码 我阅读了这篇文章以开始使用http www
  • 生成签名 APK 错误:将字节码转换为 dex 时出错以及另外 1 个错误

    当我清理 重建我的项目甚至运行应用程序时 它不会返回任何错误 但是当我生成签名的 APK 时 它返回两个错误 Error Error converting bytecode to dex Cause com android dex DexE
  • 使用 Start-Job 时本地函数调用不起作用

    function F2 String var2 function F1 String var1 F2 var2 while i le count F1 dir i Start Job ScriptBlock function F1