PowerShell的多任务后台作业

本文介绍了PowerShell中的三种作业类型:本地作业、远程处理作业及调度作业。解释了如何使用Start-Job、Invoke-Command和Register-ScheduledJob等命令创建作业,并展示了如何管理和查看这些作业的状态及结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Update:

前段时间吧,不知道运行的哪个命令,导致我电脑完全不能打字啦!只是不能打汉字,弄的我打游戏都是英文交流,但是写博客这种长篇大论的英文就SayNo了,不是不会写,是我真不会写啊!

昨晚更新了Windows版本后好了!今天开始码字!

这段时间学习了不少,都没写进博客里,就不补了吧!

PowerShell将后台执行的命令成为作业(Jobs),可以有多种方式创建作业,这里列出来大概3种吧:

1,本地作业

Start-Job

Start-Job -ScriptBlock {Get-EventLog Security -EntryType Error -Newest 6 -ComputerName server
01}

这里-ScriptBlock 后面放的就是本地作业要执行的命令,其别名是-Command 

Start-Job -Command {Get-EventLog Security -EntryType Error -Newest 6 -ComputerName server01}

创建的第一个作业名为Job1,第二个作业名为Job3,因为,每个作业至少有一个子作业,第一个子作业叫Job2;-ComputerName指定时,会与远程计算机连接,某种程度上是"远程作业",但由于在本地运行,所以我们仍视为本地作业。

另外,虽然本地作业在本地运行,但是他们也会需要使用Powershell的远程处理系统的架构,若没有启用远程处理,那么将无法创建本地作业。

查看Job运行结果的命令:Get-Job或者Receive-Job -Name查看,Job的运行结放在内存中,查看一次就清空了,想要不被清空就后边加个-Keep参数,它会在内存中保留一份输出结果的拷贝。Get-Job的输出列有个HasMoreDa他,True代表内存中还有运行结果,False代表结果已经输出过一次,没有运行-Keep参数,已经被清空了!

对于子作业,可以用Get-Job -ID 1 | Format-List * 查看子作业是谁,注意ChildJobs参数。

有一点是,父作业有好几个子作业时,可以用以下命令查看:

PS C:\Users\Administrator> Invoke-Command -Command {Get-Process} `
>> -ComputerName (Get-Content C:\Users\Administrator\Desktop\Computers.txt) `
>> -AsJob -JobName MyRemoteJob

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
12     MyRemoteJob     RemoteJob       Running       True            pc20180526,pc2018... Get-Process


PS C:\Users\Administrator> Get-Job -Id 12 | Select-Object -ExpandProperty ChildJobs

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
13     Job13                           Failed        False           pc20180526           Get-Process
14     Job14                           Failed        False           pc20180526           Get-Process
15     Job15                           Failed        False           pc20180526           Get-Process
16     Job16                           Failed        False           pc20180526           Get-Process
17     Job17                           Failed        False           pc20180526           Get-Process
18     Job18                           Failed        False           pc20180526           Get-ProcessPS C:\Users\Administrator> Get-Job -Id 12 | Select-Object -ExpandProperty ChildJobs

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
13     Job13                           Failed        False           pc20180526           Get-Process
14     Job14                           Failed        False           pc20180526           Get-Process
15     Job15                           Failed        False           pc20180526           Get-Process
16     Job16                           Failed        False           pc20180526           Get-Process
17     Job17                           Failed        False           pc20180526           Get-Process
18     Job18                           Failed        False           pc20180526           Get-Process

命令还在运行,所以是False状态,后面会说起Invoke-Command命令

 

WMI作业(Get-WMIObject)

gwmi wim32_OpreatingSystem -ComputerName (Get-Content C:\Users\Administrator\Desktop\Computer
s.txt) -AsJob

服气啦,这系统升级的我QQ打不开,系统自带的截图工具也 打不开是什么情况...只好不能放上去运行结果了~~~

这里的wmi作业就在于用了-AsJob参数,该命令通过WMI通信机制(WinRM)与远程计算机进行连接。一次连接一台计算机执行命令,直接跳过不可访问的计算机的默认规则。等同于同步执行Get-WmiObject命令,唯一不同点在该命令是后台运行的。

了解更多的-AsJob参数的命令,可以运行Help * -Parameter AsJob

你会发现,Get-CimInstance命令没有-AsJob参数,但是可以运行Start-Job或Invoke-Command命令,将Get-CimInstance放在脚本块中。

2,远程处理作业

Invoke-Command

PS C:\Users\Administrator> Invoke-Command -Command {Get-Process} `
>> -ComputerName (Get-Content C:\Users\Administrator\Desktop\Computers.txt) `
>> -AsJob -JobName MyRemoteJob

-Command指定的命令都会发送Computers.txt指定的计算机,最多可同时访问32台。除非修改-ThrottleLimit参数允许同时访问更多或更少的计算机;当指定34台时,前32台先开始只执行命令,即将结束时剩余的2台才开始执行。都结束时,上层的父作业会反馈一个完整的状态。

运行该命令是真正的分布式工作,需要每台远程计算机都安装PowerShell V2或更新的版本,开启远程处理。执行结果反馈到本地计算机。

3,调度作业 

调度作业与调度任务(标准计划任务作业)是不同的,他是PowerShell特有的,其输出结果会存到磁盘中供PowerShell后续进行使用。

触发器:New-JobTrigger 定义作业的运行时间

作业选择项设置:New-ScheduledTaskOption 比如设置作业运行时可以唤醒计算机,运行在高级特权下

创建调度作业:Register-ScheduledJob 

PS C:\Users\Administrator> Register-ScheduledJob -Name DailyProcessCheck -ScriptBlock { Get-Process } `
>> -Trigger (New-JobTrigger -Daily -At 2am) `
>> -ScheduledJobOption (New-ScheduledJobOption -WakeToRun -RunElevated) `
>> -MaxResultCount 10

Id         Name            JobTriggers     Command                                  Enabled
--         ----            -----------     -------                                  -------
3          DailyProcess... 1                Get-Process                             True

该命令新建一个调度作业,作业每天凌晨2点执行Get-Process命令。若关机会唤醒计算机,同时在高级特权下执行,执行结果存在本地磁盘中,最大存放结果数量是10 个;

通过Get-Job可以查看运行完成的调度作业结果,通过Get-SceduledJob查看调度作业状态,通过Disable-SchedluedJob或者Enable-ScheduledJob开关调度作业,其他命令,可以通过Help *ScheduledJob*查看使用,

调度作业是运行在PowerShell进程中的,如果重启电脑,进程消失,调度作业应该也就没有了。

即:仅当PowerShell进程开启,作业才会维持。关闭进程后,在进程中定义的任何作业就会消失。

调度作业结果存在磁盘上,具有权限的任何人都可以查看,修改,删除或者获取其中结果,位置是在个人的用户配置文件下,通常要求管理员从配置文件中获取文件和结果。

再举一例:

PS C:\Users\Administrator> $Trigger=New-JobTrigger -At "6:00AM" -DaysOfWeek Monday,Tuesday,Wednesday,Thursday,Friday -We
ekly ##创建触发器
PS C:\Users\Administrator> $command={ Get-EventLog -LogName System -Newest 20 -EntryType Error | Export-Clixml C:\Users\
Administrator\Desktop\25SysErr.xml } ##定义需要执行的脚本块
PS C:\Users\Administrator> Register-ScheduledJob -Name "Get 25 System Errors" -ScriptBlock $command -Trigger $Trigge
r  ##创建调度作业

Id         Name            JobTriggers     Command                                  Enabled
--         ----            -----------     -------                                  -------
5          Get 25 Syste... 1                Get-EventLog -LogName System -Newest... True


PS C:\Users\Administrator> Get-ScheduledJob | select * ##查看调度作业状态

最后需要注意的是不要混淆使用3种作业,比如:都是不正确的方式,特别是第二条虽然能运行,但是可以直接加AsJob参数运行的,没必要麻烦。使用Get-Job看不到其他用户创建的作业。调度作业是个例外上面已经讲啦!

 

PS C:\Users\Administrator> Invoke-Command -Command { Start-Job -ScriptBlock { ls}} -ComputerName localhost
[localhost] 连接到远程服务器 localhost 失败,并显示以下错误消息: 客户端无法连接到请求中指定的目标。 请验证该目标上的服
务是否正在运行以及是否正在接受请求。 有关目标(通常是 IIS 或 WinRM)上运行的 WS 管理服务,请查阅日志和文档。 如果目标是 W
inRM 服务,则在目标上运行以下命令来分析和配置 WinRM 服务: "winrm quickconfig"。 有关详细信息,请参阅 about_Remote_Troub
leshooting 帮助主题。
    + CategoryInfo          : OpenError: (localhost:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : CannotConnect,PSSessionStateBroken
PS C:\Users\Administrator> Start-Job -Command {Invoke-Command -Comm { ls } -Comp localhost }

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
20     Job20           BackgroundJob   Running       True            localhost            Invoke-Command -Comm {...Invoke-Command -Command { Start-Job -ScriptBlock { ls}} -ComputerName localhost
[localhost] 连接到远程服务器 localhost 失败,并显示以下错误消息: 客户端无法连接到请求中指定的目标。 请验证该目标上的服
务是否正在运行以及是否正在接受请求。 有关目标(通常是 IIS 或 WinRM)上运行的 WS 管理服务,请查阅日志和文档。 如果目标是 W
inRM 服务,则在目标上运行以下命令来分析和配置 WinRM 服务: "winrm quickconfig"。 有关详细信息,请参阅 about_Remote_Troub
leshooting 帮助主题。
    + CategoryInfo          : OpenError: (localhost:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : CannotConnect,PSSessionStateBroken
PS C:\Users\Administrator> Start-Job -Command {Invoke-Command -Comm { ls } -Comp localhost }

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
20     Job20           BackgroundJob   Running       True            localhost            Invoke-Command -Comm {...

 

------本次码字结束------

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值