Start-Job:调用 ScriptBlock 中的另一个脚本(循环)

Start-Job: Call another script within a ScriptBlock (Loop)

我还有一个问题,我自己用搜索也解决不了..

我有一个启动 Robocopy 作为作业的脚本,第二个作业在 运行ning 时监视此脚本,如果没有,请发送电子邮件。 现在我想添加 watch 脚本部分以再次启动整个脚本。 (循环)

& "$PSScriptRoot\Sync_Start&Watch.ps1"

Robocopy-作业:

Script_Block_Sync = {
    param ($rc_logfile, $rc_source, $rc_destination)
    robocopy $rc_source $rc_destination /MIR /SEC /SECFIX /COPYALL /m /r:5 /Mon:1 /Mot:1 /unilog:$rc_logfile
 }
Start-Job -Name Robocopy_Sync -ScriptBlock $Script_Block_Sync -ArgumentList $rc_logfile, $rc_source, $rc_destination

Watch_Job:

$Script_Block_Check = {
    param($MailParams, $mailbody_error, $PSScriptRoot)
    while ((Get-Process Robocopy).Responding) {Start-Sleep -Seconds 30}
    if (!(Get-Process Robocopy).Responding) {
        Send-MailMessage @MailParams -body $mailbody_error
        & "$PSScriptRoot\Sync_Start&Watch.ps1"
    }
}
Start-Job -Name Robocopy_Check -ScriptBlock $Script_Block_Check -ArgumentList $MailParams, $mailbody_error, $PSScriptRoot

我已经尝试使用 $PSScriptRoot,使用完整路径和单独的 $script 变量。如果我 运行 只有行 (F8) 或整个 IF 块 (F8),脚本将启动 运行ning。 如果无法启动另一个脚本,也许是另一个启动脚本的作业?

知道我错过了什么,还是仍然不可能?

感谢您的帮助!

此致

经过一周的搜索和尝试多种变体后,我找到了获得所需循环的解决方案。不是我真正想要的,但它有效。如果有人在这里读到这篇文章并有另一个甚至更好的主意,非常欢迎您!我的想法是,通过 Task Scheduler 启动脚本,在后台启动所有内容而不显示 "Running" 状态。

仅供参考: 对于我的问题,我错过了要点,即 PS 作业仅 运行 在他们开始的会话中,所以一切正常如果我在 PS ISE 中测试脚本,而不是通过任务计划程序,因为如果脚本(会话)结束,脚本中启动的作业也会结束。

所以为了得到一个循环,我使用了下面的代码:

while (!(Get-Process Robocopy).Responding) {
  $Script_Block {...}
  Start-Job -Name Robocopy -ScriptBlock $Script_Block
  Start-Sleep -Seconds 5
  while ((Get-Process Robocopy).Responding) {
    Start-Sleep -Seconds 60
  }
  Send-MailMessage ...

}