在Job被触发后执行额外的cmdlet



假设我有一个简单的Job,它是这样开始的:

$job = Start-Job -ArgumentList 1, 2 -ScriptBlock {
$var1 = $args[0]
$var2 = $args[1]
$var3 = $var1 + $var2
Write-Host $var3
}

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

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

Dennis的有用回答提供了关键的指针:使用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()
}

我认为你最好看看PowerShell运行空间,因为它们是相同进程的线程,所以可以彼此来回通信。

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

参见,MS Docs - Start-Job - runas32和MS Scripting - PowerShell Runspaces的开始使用

最新更新