鲫疹 发表于 2025-10-1 11:35:19

Powershell 管理 后台/计划 作业(六)

目录

[*]管理 后台/计划 作业

[*]后台作业

[*]本地作业
[*]远程作业
[*]CIM / WMI 作业
[*]作业的管理

[*]检索作业
[*]查看子作业
[*]简单案例


[*]计划作业

[*]作业选项
[*]作业触发器
[*]创建和注册
[*]使用流程
[*]查看与管理
[*]与任务计划程序的关系
[*]区分 PSScheduledJob vs ScheduledTasks 模块



管理 后台/计划 作业

后台作业

以其他方式启动三种类型的作业(即本地、远程和通用信息模型 (CIM)/Windows Management Instrumentation (WMI))
本地作业


[*]运行位置:本地计算机
[*]关键点:用 Start-Job 启动,脚本在后台进程运行
[*]语法:
# 运行命令块
Start-Job -ScriptBlock { Get-Process } -Name MyJob

# 运行一个脚本文件
Start-Job -FilePath "C:\scripts\backup.ps1" -Name BackupJob远程作业


[*]运行位置:远程计算机
[*]关键点:用 Invoke-Command,加 -AsJob 参数
[*]语法:
Invoke-Command -ComputerName Server01,Server02 `
-ScriptBlock { Get-Service } `
-AsJob -JobName "ServiceCheck"用途:批量对多台服务器执行任务,例如检查服务状态、收集日志。
注意:这需要远程计算机启用 PowerShell Remoting (Enable-PSRemoting)。
CIM / WMI 作业


[*]运行位置:通过 WMI/CIM 通道执行命令(不依赖 PS Remoting)。
[*]关键点:

[*]CIM 命令自身 没有 -AsJob 参数,所以要用 Start-Job 包装。
[*]WMI 命令(Get-WmiObject)有 -AsJob 参数,可以直接用。

CIM 示例
在后台查询本地/远程的操作系统信息。
Start-Job -ScriptBlock { Get-CimInstance -ClassName Win32_OperatingSystem }WMI 示例
在后台通过 WMI 查询远程机器的服务。
Get-WmiObject -Class Win32_Service -ComputerName Server01 -AsJob在上述所使用到的类型名,都可以自己去找:
# WMI
Get-WmiObject -List

# CIM
Get-CimClass作业的管理


[*]父作业 (Parent Job)

[*]顶级容器,代表整个作业。
[*]里面会有一个或多个子作业。

[*]子作业 (Child Job)

[*]每台计算机对应一个子作业。
[*]本地作业 = 1 个子作业。
[*]远程作业 / WMI 作业 = 每个目标计算机 1 个子作业。

举例:
如果你用 Invoke-Command -AsJob 发到 3 台电脑:

[*]父作业 1 个
[*]子作业 3 个(分别对应三台远程机)


[*]Get-Job = 看队列
[*]Receive-Job = 拿结果
[*]Wait-Job = 等待任务完成
[*]Remove-Job = 清理任务
[*]Stop-Job = 停止任务
检索作业


[*]列出所有作业
Get-Job

[*]按名称找作业
Get-Job -Name TestScript

[*]按 ID 找作业
Get-Job -Id 5状态 State 属性 很关键:

[*]Running(正在运行)
[*]Completed(已完成)
[*]Failed(失败)
[*]Stopped(被手动终止)
注意:父作业的状态会反映子作业中有没有失败。
即便 3 台机器里有 2 个成功,1 个失败 → 父作业显示 Failed。
查看子作业


[*]展开 ChildJobs 属性
Get-Job -Name RemoteLogs | Select-Object -ExpandProperty ChildJobs
[*]更直观的参数 (PowerShell 3.0+)
Get-Job -Name RemoteLogs -IncludeChildJobs
这样你就能看到每个子作业的 独立状态、ID、Location。
简单案例

常用管理命令:

[*]停止作业
Stop-Job -Name RemoteLogs Stop-Job -Id 6

[*]删除作业(清理内存里的结果)
Remove-Job -Name LocalDirectory

[*]等待作业完成(脚本常用)
Wait-Job -Name TestScript

[*]获取作业结果
Receive-Job -Id 4

[*]检索正在执行的任务的结果
指定 –Keep,否则后续再读取就读取不到了
Receive-Job –ID 13 -Keep | Format-Table –Property Name,Length注意:
Receive-Job 默认会“取走”结果,再次执行就读不到了。
如果要多次读取,可以加 -Keep:
Receive-Job -Id 4 -Keep表格总结回顾:
命令作用Get-Job查看所有作业(父作业 + 状态)Get-Job -IncludeChildJobs查看子作业详情Stop-Job停止正在运行的作业Remove-Job删除作业对象(释放内存)Wait-Job等待作业完成(脚本控制流用)Receive-Job获取作业结果计划作业

一个计划作业由 三部分组成:

[*]作业 (Job):要运行的命令或脚本。

[*]类似于 Start-Job -ScriptBlock { … }。

[*]作业选项 (Job Options):运行的附加条件。

[*]比如:是否需要凭据、网络可用性要求、最大运行时间等。
[*]用 New-ScheduledJobOption 创建。

[*]作业触发器 (Job Triggers):定义什么时候运行。

[*]比如:每天 9 点运行,或每周一运行,或只运行一次。
[*]用 New-JobTrigger 创建。

若要查看完整的命令列表,请运行以下命令:
Get-Command –Module ScheduledTasks常用命令:
Cmdlet说明Register-ScheduledJob创建计划作业(关键命令)Get-ScheduledJob查看计划作业Set-ScheduledJob修改作业Enable-ScheduledJob / Disable-ScheduledJob启用/禁用作业Unregister-ScheduledJob删除计划作业Get-JobTrigger / Add-JobTrigger查看或添加触发器Get-ScheduledJobOption / Set-ScheduledJobOption查看或修改选项Get-Job / Receive-Job查看计划作业的运行结果作业选项

使用 New-ScheduledJobOption 可创建新的作业选项对象
此命令具有多个参数,可用于定义作业的选项,例如:

[*]–HideInTaskScheduler,阻止作业在“任务计划程序”中显示。 如果未包括此选项,最终作业将在“任务计划程序”图形用户界面 (GUI) 中显示。
[*]–RunElevated,将作业配置为在提升的权限下运行。
[*]–WakeToRun,在作业计划运行时唤醒计算机。
使用其他参数来配置在计算机空闲时运行的作业和其他选项。 许多参数与“任务计划程序”GUI 中的选项对应。
使用以下命令创建新的选项对象并将其存储在变量中:
$opt = New-ScheduledJobOption –RequireNetwork –RunElevated -WakeToRun作业触发器

作业触发器定义作业何时运行。 每个作业可以有多个触发器。 使用 New-JobTrigger 命令创建触发器对象。 有五种基本类型的触发器:

[*]–Once 指定只运行一次的作业。 还可以指定 –RandomDelay,并且必须指定 –At 参数来定义作业何时运行。 此参数接受 System.DateTime 对象或可解释为日期的字符串。
[*]–Weekly 指定每周运行的作业。 可指定 –RandomDelay,并且必须同时指定 –At 和 –DaysOfWeek 参数。 –At 采用日期和时间来定义作业何时运行。 –DaysOfWeek 采用一周中的某一天或多天来运行作业。 通常会用 –At 来指定时间并使用 –DaysOfWeek 定义作业应该运行的天数。
[*]–Daily 指定每天运行的作业。 必须指定 –At 并指定作业何时运行。 还可以指定 –RandomDelay。
[*]–AtLogOn 指定用户登录时运行的作业。 此类作业类似于登录脚本,不同之处在于它是在本地而非在域中定义。 可指定 –User 来限制触发作业的用户帐户,并指定 –RandomDelay 来添加随机延迟。
[*]AtStartUp 与 –AtLogOn 类似,不同之处在于它在计算机启动时运行作业。 这通常会在用户登录前运行作业。
例如,以下命令创建一个触发器,该触发器在当地时间每周一和周四下午 3:00 运行:
$trigger = New-JobTrigger -Weekly -DaysOfWeek Monday,Thursday -At '3:00PM'创建和注册

使用 Register-ScheduledJob 可创建和注册新的计划作业。 指定以下任何参数:

[*]–Name 是必需的,它指定作业的显示名称。
[*]–ScriptBlock 是必需的,它指定作业运行的一个或多个命令。 还可以指定 –FilePath 并提供作业将运行的 Windows PowerShell 脚本文件的路径和名称。
[*]–Credential 是可选的,它指定将用于运行作业的用户帐户。
[*]–InitializationScript 接受可选的脚本块。 此脚本块中的一个或多个命令将在作业开始之前运行。
[*]–MaxResultCount 是可选的,它指定要存储在磁盘上的最大结果集数。 达到此数量后,shell 会删除旧结果,用于为新结果腾出空间。 -MaxResultCount 参数的默认值为 32。
[*]–ScheduledJobOption 接受作业选项对象。
[*]–Trigger 接受作业触发器对象。
若要使用 $opt 中的选项对象和 $trigger 中的触发器对象注册新作业,请使用以下示例:
$opt = New-ScheduledJobOption -WakeToRun

$trigger = New-JobTrigger -Once -At (Get-Date).AddMinutes(5)

Register-ScheduledJob -Trigger $trigger -ScheduledJobOption $opt -ScriptBlock { Dir C:\ } -MaxResultCount 5 -Name "LocalDir"

Id         Name            JobTriggers   Command       Enabled   
--         ----            -----------   -------      -------   
1          LocalDir      1                Dir C:\      TrueWindows PowerShell 在 Windows“任务计划程序”中注册生成的作业,并在磁盘上创建作业定义。 作业定义是存储在您的用户配置文件文件夹中的 XML 文件,路径为 \AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs。
可以运行 Get-ScheduledJob 来查看本地计算机上的计划作业列表。
如果知道计划作业的名称,可以使用 Get-JobTrigger 和 –Name 参数来检索此作业的触发器列表。
使用流程

步骤 1:定义触发器
每天上午 9 点运行
$trigger = New-JobTrigger -Daily -At 9am步骤 2:定义选项
管理员权限运行,即使在笔记本电池模式下也能继续(参数:ContinueIfGoingOnBattery)
$options = New-ScheduledJobOption -RunElevated -ContinueIfGoingOnBattery步骤 3:注册作业
创建一个每天 9 点运行的作业,把 Get-ChildItem 的结果保存到磁盘
Register-ScheduledJob -Name "DailyDirJob" -ScriptBlock { Get-ChildItem C:\ -Recurse } -Trigger $trigger -ScheduledJobOption $options查看与管理

查看作业定义
Get-ScheduledJob查看触发器和选项
Get-JobTrigger -Name DailyDirJob
Get-ScheduledJobOption -Name DailyDirJob手动运行一次
Start-Job -DefinitionName DailyDirJob查看结果
Get-Job -Name DailyDirJob
Receive-Job -Name DailyDirJob -Keep删除作业
Unregister-ScheduledJob -Name DailyDirJob与任务计划程序的关系

计划作业在 任务计划程序 中存储在:
Microsoft\Windows\PowerShell\ScheduledJobs在任务计划程序 GUI 里能看到对应的任务:

[*]触发器 = 作业触发器
[*]条件/常规 = 作业选项
[*]历史记录 = 执行日志
注意:如果你在任务计划程序 GUI 里修改了触发器或条件,这些修改会影响后续的所有运行。
区分 PSScheduledJob vs ScheduledTasks 模块


[*]PSScheduledJob:专门给 PowerShell 用的“计划作业”,结果保存到 PowerShell 自己的输出存储中,可以 Receive-Job。
[*]ScheduledTasks:Windows 原生任务计划程序管理模块,可以操作所有任务(包括 PowerShell 以外的任务)。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Powershell 管理 后台/计划 作业(六)