当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell计划任务:管理任务的神奇方法

作者:精品下载站 日期:2024-12-14 13:02:49 浏览:13 分类:玩电脑

PowerShell计划任务:管理任务的神奇方法


您是否需要创建大量计划任务或自动创建计划任务?如果是这样,那么你很幸运。在本文中,您将学习如何使用 PowerShell 管理计划任务。

执行简单操作的计划任务可以快速完成,并且可以使用任务计划程序应用程序界面 (GUI) 轻松重复。但是,系统管理员或开发人员可能需要部署具有多个计划、触发器或参数的更复杂的任务。

幸运的是,您可以使用 PowerShell 来创建和管理计划任务。通过使用 Windows 内置的 ScheduledTasks 模块,可以使用 PowerShell 管理计划任务。

先决条件

由于这是一篇边做边学的文章,因此有一些先决条件,以便您可以继续阅读。以下是使用 PowerShell 创建 PowerShell 计划任务的要求。

  • 本文中的示例使用 Windows 10。但 Windows Server 2012 及更高版本也可以执行相同的操作。
  • Windows PowerShell 5.1 或 PowerShell 7。
  • 如果您有一个脚本编辑器,例如 Visual Studio CodeNotepad++ 或 Windows PowerShell ISE,将会有所帮助。

创建新的计划任务

计划任务至少需要两个组件才能工作;动作和触发。添加安全上下文和一组相关设置是可选的。为了更好地理解,请参阅下面每个计划任务组件的简要说明:

  • 操作 - 计划任务执行的操作。操作通常是运行程序或脚本。一项计划任务可以有多个操作。
  • 触发器 - 控制计划任务的运行时间。触发器可以是基于时间的,例如设置每日或每小时重复的计划。触发器也可以是基于活动的,它根据检测到的活动(例如计算机启动、用户登录或记录的事件)运行任务。
  • 主体 - 控制用于运行计划任务的安全上下文。其中,主体包括用户帐户和计划任务使用的所需权限。
  • 设置 - 是一组选项和条件,用于控制计划任务的行为方式。例如,您可以自定义任务,使其在连续几天未使用后被删除。

在计划任务创建期间,主体和设置不是明确必需的。而是使用默认值。

创建任务操作

当您希望计划任务执行某些操作时,请创建新的任务操作。在此示例中,您将创建一个调用 PowerShell.exe 并运行脚本的任务。确保准备好脚本编辑器。

请注意,下面的脚本只是一个随机示例,您不需要使用它。您可以使用任何您想要的脚本。但是,使用下面的脚本会创建一个易于验证的结果,可以确认计划任务是否有效。

下面的示例脚本在执行时会从应用程序事件日志中获取前十个最新事件。然后,将事件导出到 c:\temp 文件夹中的新 XML 文件。复制下面的代码,将其粘贴到脚本编辑器中,并以文件名 Get-LatestAppLog.ps1 保存在您想要的任何文件夹中。

# Get-LatestAppLog.ps1

## Define the log file
$logDir = 'c:\temp'
$logFile = "$logDir\AppLog_$(Get-Date -format 'yyyy-mm-dd_hh-mm-ss-tt').xml"

## Get the ten latest application log events
Get-WinEvent -LogName application -MaxEvents 10 |
Export-CliXml $logFile -Force

下面的代码使用 New-ScheduledTaskAction 创建一个存储在 $taskAction 变量中的新计划任务操作对象。此操作将调用 powershell.exe 可执行文件并传递参数以运行C:\scripts\Get-LatestAppLog.ps1。

# Create a new task action
$taskAction = New-ScheduledTaskAction `
    -Execute 'powershell.exe' `
    -Argument '-File C:\scripts\Get-LatestAppLog.ps1'
$taskAction

复制上面的命令并在 PowerShell 中运行它。 $taskAction 变量中的结果对象应如下图所示。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

添加触发器

现在您已经创建了任务操作,下一步是定义任务必须运行的时间。用于创建触发器的 cmdlet 是 New-ScheduledTaskTrigger cmdlet。以下命令创建一个触发器,以在每天下午 3 点运行。在 PowerShell 中复制并运行代码。

# Create a new trigger (Daily at 3 AM)
$taskTrigger = New-ScheduledTaskTrigger -Daily -At 3PM
$tasktrigger

$tasktrigger 变量中的结果对象应与下图相同。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

注册任务

到目前为止,您已经创建了创建新计划任务的基本要求。下一步是创建计划任务并将其注册到系统中。

下面的代码使用 Register-ScheduledTask cmdlet 来注册计划任务。需要 -Action 参数来传递存储在名为 $taskAction 的变量中的任务操作对象。需要 -Trigger 参数来传递 $taskTrigger 变量内容。

# Register the new PowerShell scheduled task

# The name of your scheduled task.
$taskName = "ExportAppLog"

# Describe the scheduled task.
$description = "Export the 10 newest events in the application log"

# Register the scheduled task
Register-ScheduledTask `
    -TaskName $taskName `
    -Action $taskAction `
    -Trigger $taskTrigger `
    -Description $description

复制上面的代码并在 PowerShell 中运行它。这样,新的计划任务就被注册了,如下所示。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

运行任务

创建计划任务后,您应该确认系统中是否存在该计划任务。 打开任务计划程序并从列表中找到计划任务。您应该在列表中看到已注册的任务。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

您还可以通过运行下面的 PowerShell 命令来确认注册的计划任务是否存在。

Get-ScheduledTaskInfo -TaskName ExportAppLog

然后您应该会看到类似的输出,如下面的结果屏幕截图所示。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

最后,您的新计划任务应该能够确定您到目前为止所做的是否成功。要测试计划任务,您可以等待下一次运行计划,也可以使用以下命令手动触发。

Start-ScheduledTask -TaskName ExportAppLog

运行代码后,您应该会看到与下图类似的结果。正如您所看到的,运行代码创建了一个 XML 文件,这表明计划任务按预期工作。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

更新现有计划任务

创建计划任务后,它的某些方面可能需要在某个时刻进行更新。也许您想让它提前一个小时运行或更改脚本文件的位置。这些是可能需要对计划任务进行的一些更改。

在接下来的部分中,您将了解如何使用 PowerShell 对现有注册的计划任务进行更改。

更改用户帐户、安全选项和兼容性设置

在上一节中,计划任务在创建它的同一用户帐户上下文下运行。例如,如果任务需要使用另一个用户帐户(例如服务帐户)运行,该怎么办?

在此示例中,您将计划任务的安全选项修改为以下设置。

  • 您必须更改用户帐户才能运行计划任务。
  • 无论用户是否登录,都允许任务运行。
  • 以最高级别的权限运行。
  • 设置任务与 Windows 10 的兼容性。

下面代码中的第一行将使用新用户帐户创建一个主体对象,并将任务设置为以最高权限运行。确保根据需要更改 -UserID 参数的值。第二行配置任务与 Windows 10 的兼容性。

最后,第三行使用存储在 $taskPrincipal$taskSettings 变量中的值更新 ExportAppLog **计划任务。复制下面的代码并在 PowerShell 中运行它。

# Set the task principal's user ID and run level.
$taskPrincipal = New-ScheduledTaskPrincipal -UserId 'DEVPC\svcTask' -RunLevel Highest
# Set the task compatibility value to Windows 10.
$taskSettings = New-ScheduledTaskSettingsSet -Compatibility Win8
# Update the task principal settings
Set-ScheduledTask -TaskName 'ExportAppLog' -Principal $taskPrincipal -Settings $taskSettings

您会注意到 -Compatibility 参数值为 Win8。不要感到困惑。自 Windows 8 以来,微软似乎没有更新“最新”版本选择。尽管如此,指定 Win8 值将导致 Windows 10 兼容性。

接下来,以下命令使用 Set-ScheduledTask cmdlet 更新现有的 ExportAppLog **计划任务。确保更改 -Password 参数中的密码值以使用用户帐户的正确密码。

# Update the task user account and password
Set-ScheduledTask -TaskName 'ExportAppLog' -User $taskPrincipal.UserID -Password 'PASSWORD'

运行上述命令后,计划任务就会更新。如果您检查计划任务,则可以确认安全选项已更改。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

改变触发器

有时需要更改触发时间表。可能是因为一些运营调整或者资源优化。无论如何,您还可以使用 PowerShell 替换或添加触发器到计划任务。

目前,计划任务 ExportAppLog 每天下午 3 点触发。假设您需要将触发计划更改为每天下午 4:30 和凌晨 1:00。您首先需要为两个计划创建两个新的任务触发器对象。

$taskTrigger1 = New-ScheduledTaskTrigger -Daily -At 4:30PM
$taskTrigger2 = New-ScheduledTaskTrigger -Daily -At 1:00AM

然后,要更新计划任务的触发器,请使用以下命令。您会注意到 -Trigger 参数接受两个任务触发器对象,即 $taskTrigger1$taskTrigger2

此外,由于您要使用为用户帐户保存的密码来更新计划任务,因此您需要再次提供 -User-Password 值。

Set-ScheduledTask -TaskName 'ExportAppLog' -Trigger $taskTrigger1,$taskTrigger2 -User 'DEVPC\svcTask' -Password 'PASSWORD'

下面是运行代码后的预期结果。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

如下所示,ExportAppLog 计划任务中现在有两个触发器。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

删除和恢复定时任务

随着时间的推移,计划任务可能会变得过时。在某些时候,您可能需要对计划任务执行内务处理。在本部分中,您将了解如何在 PowerShell 中管理计划任务删除。

备份计划任务

在继续删除计划任务之前,最好先进行备份。备份计划任务可为您提供出现问题时的恢复点。

没有内置的 cmdlet 来进行计划任务备份。但是,PowerShell 中的所有内容都是对象,并且可以将对象导出到文件。当您需要将对象备份到文件时,请使用 Export-Clixml cmdlet。

下面的示例代码将名为 ExportAppLog 的计划任务导出到文件。您可以根据您的喜好更改文件名和位置。

# Export the scheduled task object to XML
Get-ScheduledTask -TaskName 'ExportAppLog' | Export-Clixml c:\temp\ExportAppLog.xml

下图显示了预期的输出 XML 文件。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

删除计划任务

一旦您获得了计划任务的备份,您现在就可以删除该计划任务。下面的代码删除名为 ExportAppLog 的计划任务。复制下面的代码并在 PowerShell 中运行。

# Unregister the scheduled task
Unregister-ScheduledTask -TaskName 'ExportAppLog' -Confirm:$false

虽然不是必需的,但确认计划任务删除的结果总是好的。使用以下命令验证计划任务是否不再存在。

Get-ScheduledTask -TaskName 'ExportAppLog'

如果计划任务不再存在,您应该会得到如下所示的输出。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

请注意,计划任务备份不包含密码。

恢复定时任务

所以你删除了计划任务,然后发现你不应该这么做!现在怎么办?这种情况让你更加体会到备份的概念。

您可以通过 PowerShell 使用 XML 备份文件重新创建计划任务。以下是如何进行恢复。

首先,将 XML 备份导入到 PowerShell 会话中。下面的代码导入文件c:\temp\ExportAppLog.xml。因此,$stBackup 变量将保存导入的数据。

# Import the Schedule Task backup
$stBackup = Import-Clixml -Path c:\temp\ExportAppLog.xml

接下来,使用下面的代码将任务主体的 LogOnType 值重置为 Interactive。重置LogonType值对于确保成功恢复计划任务至关重要。

# Reset the logon type to "Run only when the user is logged on."
$stBackup.Principal.LogonType = 'Interactive'

下一步是创建一个新的计划任务对象。下面的代码创建一个新的计划任务。 $restoreTask 变量存储生成的计划任务对象。

您会注意到传递给参数的值是从备份导入的值。导入的值位于 $restoreTask 变量中。参数为ActionTriggerSettingsPrincipal。

# Create a new Scheduled Task object using the imported values
$restoreTask = New-ScheduledTask `
    -Action $stBackup.Actions `
    -Trigger $stBackup.Triggers `
    -Settings $stBackup.Settings `
    -Principal $stBackup.Principal

创建好定时任务对象后,就可以注册定时任务了。使用下面的代码来注册恢复的计划任务。

在此示例中,任务名称为“ExportAppLog_restored”。InputObject 参数接受 $restoreTask 变量中的计划任务对象。确保使用正确的用户密码值。

Register-ScheduledTask `
    -TaskName 'ExportAppLog_restored' `
    -InputObject $restoreTask `
    -User 'DEVPC\svcTask' `
    -Password 'PASSWORD'

代码现已完成。在 PowerShell 中复制并运行代码以恢复已删除的计划任务。下面的屏幕截图显示了运行代码后的预期输出。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

现在计划任务已注册到系统中。下面的屏幕截图显示了恢复的计划任务。

[玩转系统] PowerShell计划任务:管理任务的神奇方法

概括

Windows 中的计划任务功能是用于设置任务或作业的出色工具。您可以创建最基本到更复杂的任务。设置和选项很灵活。

通过 PowerShell 计划任务模块,可以使用 PowerShell 命令设置计划任务。该模块提供了在本地和远程计算机上以编程方式创建和部署计划任务的机会和方法。

Microsoft 尚未更新 ScheduledTasks 模块,并且某些高级设置尚未轻松公开为 PowerShell cmdlet。一个示例是为“在工作站解锁时”创建触发器。但是,您可以通过使用现有的任务计划程序 CIM 类来实现这些高级设置。

尽管如此,PowerShell 计划任务模块仍然是一个优秀且功能强大的工具,您可以将其添加到您的 PowerShell 库中。

参考

  • 如何使用计划任务自动进行文件传输
  • 使用 PowerShell 创建计划任务
  • 升级到 PowerShell 7:演练
  • 在工作站解锁时执行的语法

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯