【问题标题】:Executing additional cmdlets after a Job was fired off在 Job 被解雇后执行额外的 cmdlet
【发布时间】:2021-10-26 20:35:52
【问题描述】:

假设我有一个这样开始的简单工作:

$job = Start-Job -ArgumentList 1, 2 -ScriptBlock {
        $var1 = $args[0]
        $var2 = $args[1]

        $var3 = $var1 + $var2

        Write-Host $var3
}

现在假设我想继续执行 $job 会话并引入新参数,然后继续在 $job 内执行。

据我了解,这不是乔布斯在 Powershell 中的工作方式。一旦作业内部的命令被执行,作业就被认为已经完成,不能再被回收。如果我的理解是正确的,是否有任何其他方法可以实现在您的 powershell 会话中有效地拥有后台任务的效果,您可以继续注入新的命令/变量,而无需创建新的作业/会话/进程?为清楚起见,这是本地的(在同一台机器上)。

【问题讨论】:

    标签: powershell windows-terminal


    【解决方案1】:

    Dennis' helpful answer 提供了关键指针:使用PowerShell SDK 创建一个进程内 PowerShell 实例,您可以使用该实例重复调用命令。

    以下示例代码演示了这一点:它不断提示您执行命令并使用单个可重复使用的PowerShell 实例来执行它(按Ctrl-C 退出):

    $ps = [powershell]::Create()
    
    while ($true) {
      $cmd = Read-Host 'Type a command to execute'
      # Execute and output the results.
      $ps.AddScript($cmd).Invoke()
      # Relay errors, if any.
      $ps.Streams.Error | Write-Error
      # Reset in preparation for the next command.
      $ps.Commands.Clear(); $ps.Streams.ClearStreams()
    }
    

    【讨论】:

      【解决方案2】:

      我认为您最好研究 PowerShell 运行空间,而不是可以相互通信,因为它们是相同进程的线程。

      Start-Job 实际上在一个单独的隔离进程中启动了一个新的 PowerShell 会话。

      见,MS Docs - Start-Job -RunAs32MS Scripting - Beginning Use of PowerShell Runspaces

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 2013-03-25
        • 2018-11-04
        • 1970-01-01
        相关资源
        最近更新 更多