在 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()
}
假设我有一个像这样开始的简单工作:
$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
以下示例代码演示了这一点:它不断提示您执行命令并使用单个可重复使用的 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()
}