Ps1 使用任务计划程序时脚本未正确执行
Ps1 script not executing properly when using Task Scheduler
我正在尝试使用 Task Scheduler 来 运行 一个 PS1 脚本,但是它似乎不起作用。当我 运行 任务 PowerShell 短暂打开时,但脚本没有 运行。当我手动执行脚本时,它按预期 运行s。
- 任务计划程序设置:
- 操作:
Start a Program
- 程序:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- 参数:
D:\Powershell\test.ps1
- 配置:
Win10
脚本:
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
我正在尝试使用 Task Scheduler 来 运行 一个 PS1 脚本,但是它似乎不起作用。当我 运行 任务 PowerShell 短暂打开时,但脚本没有 运行。当我手动执行脚本时,它按预期 运行s。
- 任务计划程序设置:
- 操作:
Start a Program
- 程序:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- 参数:
D:\Powershell\test.ps1
- 配置:
Win10
- 操作:
脚本:
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