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 ...
}
我还有一个问题,我自己用搜索也解决不了..
我有一个启动 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 ...
}