Ps1 使用任务计划程序时脚本未正确执行

Ps1 script not executing properly when using Task Scheduler

我正在尝试使用 Task Scheduler 来 运行 一个 PS1 脚本,但是它似乎不起作用。当我 运行 任务 PowerShell 短暂打开时,但脚本没有 运行。当我手动执行脚本时,它按预期 运行s。

脚本:

Add-Type -AssemblyName System.Windows.Forms
$Timer = [System.Timers.Timer]::new(3000)
Register-ObjectEvent -InputObject $Timer -EventName Elapsed -Action{
    [System.Windows.Forms.SendKeys]::SendWait("%{TAB}")
}

$Timer.Start()

这里有什么我遗漏的吗?

如我的评论所述,要执行脚本 (*.ps1),您只需调用 -File 参数或简称 -f 但是,仅执行此操作不会产生结果在你想要的(一个 Alt-Tabbing 无限期 的任务?)因为任务会在 ObjectEvent 被注册后立即结束。

作为解决方法,您需要找到一种方法让计划任务保持活动状态,因此,让后台的 powershell.exe 进程 运行 保持活动状态。

我将列出几个选项,以便您可以决定您更喜欢哪个或适合您的需要

  • imo,最简单的方法就是将 -NoExit 参数添加到您的任务中,这将使任务无限期地保持活动状态,直到手动结束它/重新启动/关闭/终止powershell.exe 流程/等等

    • 程序:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    • 参数:-WindowStyle Hidden -NoExit -f "D:\testing\script.ps1"
  • 在代码上添加一个循环,为此你有很多选择,例如
    Get-EventSubscriber | Wait-Event,与以前一样,这将使任务无限期地保持活动状态。

    • 程序:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    • 参数:-WindowStyle Hidden -f "D:\testing\script.ps1"
    • 代码:
Add-Type -AssemblyName System.Windows.Forms
$Timer = [System.Timers.Timer]::new(3000)
Register-ObjectEvent -InputObject $Timer -EventName Elapsed -Action {
    [System.Windows.Forms.SendKeys]::SendWait("%{TAB}")
}

$Timer.Start()

Get-EventSubscriber | Wait-Event
  • 一个循环,可以使任务保持 X 天/小时/分钟:
    • 程序:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    • 参数:-WindowStyle Hidden -f "D:\testing\script.ps1"
    • 代码(您可以在此处使用 [datetime] 对象而不是 [System.Diagnostics.Stopwatch],您自己调用):
Add-Type -AssemblyName System.Windows.Forms
$Timer = [System.Timers.Timer]::new(3000)
Register-ObjectEvent -InputObject $Timer -EventName Elapsed -Action {
    [System.Windows.Forms.SendKeys]::SendWait("%{TAB}")
}

$Timer.Start()

$elapsed = [System.Diagnostics.Stopwatch]::StartNew()

do {
    Start-Sleep -Milliseconds 5
} until($elapsed.Elapsed.Minutes -ge 60)

$elapsed.Stop()
exit 0
  • 最后一个,类似于之前的示例,但根本没有使用 ObjectEvent
    • 程序:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    • 参数:-WindowStyle Hidden -f "D:\testing\script.ps1"
    • 代码:
Add-Type -AssemblyName System.Windows.Forms

$elapsed = [System.Diagnostics.Stopwatch]::StartNew()

do {
    [System.Windows.Forms.SendKeys]::SendWait("%{TAB}")
    Start-Sleep -Milliseconds 3000
} until($elapsed.Elapsed.Seconds -ge 30)

$elapsed.Stop()
exit 0