在 Job 被解雇后执行额外的 cmdlet

Executing additional cmdlets after a Job was fired off

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

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

        $var3 = $var1 + $var2

        Write-Host $var3
}

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

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

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

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

看,MS Docs - Start-Job -RunAs32 and MS Scripting - Beginning Use of PowerShell Runspaces

provides the crucial pointer: use the 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()
}