Powershell 如何创建两个运行时间相差一小时但从不重叠的计划任务?

Powershell 如何创建两个运行时间相差一小时但从不重叠的计划任务?,powershell,scheduled-tasks,Powershell,Scheduled Tasks,我需要使用powershell创建两个计划任务,每个任务将运行powershell脚本 每天08:00触发一次,每两小时运行一次。所以在10:00,12:00,14:00等等。。 另一个每天9点,每两小时运行一次。所以在11:00,13:00,15:00等等 如果用户未登录,则应在用户登录后立即触发任务。 假设他在9:35登录,这将触发两个任务。它们怎么能不同时运行呢 我试图为其中一个添加延迟,但延迟可能为0 解决方案可以是: 当它们同时运行时,它们会检查是否存在这种情况,并检查其中一个出口。或

我需要使用powershell创建两个计划任务,每个任务将运行powershell脚本

每天08:00触发一次,每两小时运行一次。所以在10:00,12:00,14:00等等。。 另一个每天9点,每两小时运行一次。所以在11:00,13:00,15:00等等

如果用户未登录,则应在用户登录后立即触发任务。 假设他在9:35登录,这将触发两个任务。它们怎么能不同时运行呢

我试图为其中一个添加延迟,但延迟可能为0

解决方案可以是:

  • 当它们同时运行时,它们会检查是否存在这种情况,并检查其中一个出口。或者
  • 确保它们不被拦截的其他方法
  • 这个问题是关于,一个经过充分研究的问题

    一个简单的解决方案是基于共享资源。当任务启动时,它会尝试获取资源上的独占锁。如果不可能,任务将等待并重试,直到授予超时或锁定。当锁保持任务完成其工作后,它将释放锁作为清理的一部分

    简单的解决方案不能保证公平调度,因此,如果需要公平,请查找更多实现

    至于评论:不要依赖pid。在Windows中,进程ID可以重用

    为了快速演示,让我们使用这样的标志文件

    function getlock() {
        $file = $null
        while($file -eq $null) {
            try { $file = [System.IO.File]::Open("c:\temp\flag.txt", "open", "read", "none") } catch {
                write-host "waiting..."
                start-sleep -seconds 2
            }
        }
    
        write-host "got lock!"
        start-sleep -seconds 5
        $file.close()
    }
    
    通过将函数加载到两个Powershell会话中并在几秒钟内调用它们来尝试。如果您在任务切换方面有问题,请增加5秒钟的睡眠时间。每个函数都将尝试获取标志文件的独占锁。如果不可能,将抛出异常。游戏后期的进程将休眠两秒钟,然后重试,直到第一个进程释放锁为止。有关文件共享模式的详细信息,请参阅


    标记文件有问题,因此要获得更健壮的IPC,请参阅。它是为C#设计的,但也可以为Powershell进行调整。

    听起来像是家庭作业。;-)到目前为止你尝试了什么?请出示你的密码。你可以看一看,也可以。我添加了我的代码。它不是家庭作业,而是一个更大项目的一部分。这个锁可以与计划任务的pid关联吗?这意味着如果计划的任务结束/失败,或者如果pc在此过程中关机,文件是否会被解锁?能否指定执行此操作的powershell cmdlet?
    function getlock() {
        $file = $null
        while($file -eq $null) {
            try { $file = [System.IO.File]::Open("c:\temp\flag.txt", "open", "read", "none") } catch {
                write-host "waiting..."
                start-sleep -seconds 2
            }
        }
    
        write-host "got lock!"
        start-sleep -seconds 5
        $file.close()
    }