【问题标题】:Start-Job: Call another script within a ScriptBlock (Loop)Start-Job:在 ScriptBlock 中调用另一个脚本(循环)
【发布时间】:2020-05-19 05:12:13
【问题描述】:

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

我有一个脚本将 Robocopy 作为作业启动,另一个作业会监视该脚本是否正在运行,如果没有,请发送电子邮件。 现在我想添加监视脚本部分以再次启动整个脚本。 (循环)

& "$PSScriptRoot\Sync_Start&Watch.ps1"

Robocopy-Job:

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),则脚本开始运行。 如果无法启动另一个脚本,也许是另一个启动脚本的作业?

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

感谢您的帮助!

最好的问候

【问题讨论】:

    标签: powershell powershell-5.0


    【解决方案1】:

    经过一周的搜索和尝试多种变体后,我找到了获得所需循环的解决方案。不是我真正想要的,但它有效。如果有人在这里阅读并有另一个甚至更好的想法,非常欢迎您!我的想法是,通过任务计划程序启动一个脚本,在后台启动所有内容而不显示“正在运行”状态。

    仅供参考:对于我的问题,我错过了这一点,即 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 ...
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多