PowerShell有四种类型的作业—后台作业、远程作业、WMI作业和计划作业。加入我们,了解它们是什么以及如何使用它们。
请务必阅读本系列之前的文章:
整个星期请继续关注本系列的其余部分。
到目前为止,我在PowerShell中向您展示的所有内容都是同步的,这意味着我们在shell中键入了一些内容,在该命令执行完毕之前,我们实际上做不了多少工作。这就是背景工作的用武之地。要启动后台作业,只需将脚本块传递给start-job cmdlet。
Start-Job –Name GetFileList –Scriptblock {Get-ChildItem C:\ –Recurse}
现在,当脚本块在后台执行时,我们可以在shell中自由地执行任何操作。
启动新作业时,PowerShell将创建表示该作业的新作业对象。通过运行get-Job cmdlet,可以随时获取所有作业的列表。
作业对象告诉您作业的状态。例如,在上面的屏幕截图中,我们可以看到一个名为GetFileList的BackgroundJob仍在运行,但已经开始返回数据。如果在任何时候您决定作业已经运行了太长时间,您可以通过管道将其发送到stop job来轻松地停止它。
Get-Job –Name GetFileList | Stop-Job
然而,一旦你停止了一个作业,它接收到的任何数据直到你停止它的时候都是可用的。不过,有个问题。在PowerShell中,一旦收到作业的结果,它们就会被删除。为了使它们保持不变,必须指定Receive–Job的keep开关参数。
Get-Job –Name GetFileList | Receive-Job –Keep
一旦你完成了一项工作,最好的做法是删除它。要删除作业,只需将其通过管道发送到remove-job cmdlet。
Get-Job –Name GetFileList | Remove-Job
这将从Get Job返回的作业列表中删除它。
几节课之前,我们研究了如何使用远程处理在远程计算机上使用Invoke命令执行PowerShell命令,但是您知道也可以使用Invoke命令在后台启动远程处理作业吗?为此,只需在命令末尾添加–AsJob参数:
Invoke-Command -ComputerName Flash,Viper -Credential administrator -ScriptBlock {gci} –AsJob
这是一个简单的命令,现在应该已经执行完毕了,让我们看看我们的作业状态。
嗯,看来失败了。这是我第一次接触到乔布斯。在PowerShell中创建任何类型的新作业时,它会为运行作业的每台计算机创建一个父作业和一个子作业。当您使用Get-Job cmdlet时,它只显示父作业,state属性是最坏的情况,这意味着即使命令仅在一百台计算机中的一台计算机上运行失败,父作业状态也会显示为failed。要查看子作业列表,需要使用IncludeChildJob参数。
如果你仔细看,你会发现这项工作确实只在一台电脑上失败了,这就把我们带到了下一个问题。尝试获取作业的结果时,如果指定父作业的名称或ID,PowerShell将返回所有子作业的数据。问题是,如果其中一个子作业出现错误,我们将得到一些红色文本。
有两种方法可以解决这个问题。首先,如果您知道要为哪些计算机获取结果,只需使用Recieve–Job cmdlet的ComputerName参数即可。
Get-Job –Id 3 | Receive-Job –Keep –ComputerName Viper
或者,您可以使用特定子作业的作业id从该子作业获取结果。
Get-Job -Id 3 –IncludeChildJob
Get-Job -Id 5 | Receive-Job –Keep
WMI作业与远程作业非常相似,只需要将–AsJob参数添加到Get-WmiObject cmdlet。
不幸的是,这意味着它们也受到我在远程作业部分中提到的相同问题的影响。
我们研究的最后三种工作不是持久性的,这意味着它们只在当前会话中可用。基本上,这意味着如果您启动一个作业,然后打开另一个PowerShell控制台并运行Get job,您将看不到任何作业。但是,回到您启动作业的控制台,您将能够看到其状态。这与持久的计划作业不同。基本上,计划作业是按计划运行的脚本块。在过去,同样的效果也可以通过使用Windows任务调度器来实现,而这正是引擎盖下正在发生的事情。要创建新的计划作业,请执行以下操作:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock {Get-EventLog -LogName Security -Newest 100} -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
这个命令里有很多东西,所以让我们把它分解一下。
由于这是一种稍有不同的作业类型,因此还需要使用不同的命令来检索计算机上所有计划作业的列表。
Get-ScheduledJob
就这些。
使用Windows10的PowerShellcmdlet,您可以轻松地添加应用程序,以便在启动时自动触发VPN连接。自动化这个任务意味着当你使用某些应用程序时,你甚至不必考虑连接到VPN。 要利用PowerShell中的此功能,如果您还没有VPN服务,则必须...
Windows PowerShell具有内置的命令历史记录功能,可提供有关已运行命令的详细信息。与命令提示符一样,PowerShell只记住当前会话的命令历史记录。 如何使用命令行缓冲区 相关:极客学校:学习如何用PowerShell自动化Windows PowerShel...
...可以轻松地重命名一个或多个文件,但使用命令提示符或PowerShell,您还可以执行更多操作。再加上第三方重命名工具,可能性是无穷的。让我们看看每个选项及其工作原理。 在windows资源管理器中重命名多个文件 Windows资源管...
....1和7上执行此操作的几种不同方法。 简单的方法:使用powershell命令 相关:极客学校:学习如何用PowerShell自动化Windows PowerShell是Windows中最强大的工具之一,所以它当然可以做一些简单的事情,比如列出你安装的程序。事实上...
...尝试运行它。这不需要太多时间,可能会有帮助。 向powershell重新注册windows应用商店 如果所有这些都失败了,您可以尝试重新注册Windows应用商店,这是您可以重新安装它。为此,您需要使用PowerShell,这是一种内置于Windows中...
...题,通常可以通过更换至少一个柱塞杆来解决。 windows powershell(x86) PowerShell是一种高级脚本环境。对于那些在Windows上真正需要命令行界面的人来说,PowerShell是Windows命令提示符的强大继承者。如果您不需要一个强大的命令行...
Windows7增加了PowerShell,一种比命令提示符更强大的命令行shell和脚本语言。自Windows7以来,PowerShell变得更加突出,它甚至成为Windows10的默认选择。 PowerShell比传统的命令提示符更复杂,但它也更强大。命令提示符明显不如Linux和...
...的计算机上一次启动的时间。在上一次安装Geek School for PowerShell时,我们将编写一个可重用的PowerShell命令来完成同样的任务。 请务必阅读本系列之前的文章: 了解如何使用PowerShell自动化Windows 学习在PowerShell中使用cmdlet 学习如...
PowerShell为您提供了两种扩展shell的方法。您可以使用管理单元,它是二进制的,并且是用成熟的编程语言(如C#)开发的,也可以使用模块,它可以是二进制的,也可以是基于脚本的。 请务必阅读本系列之前的文章: 了解如何...
由于PowerShell基于.Net框架,并结合了各种其他技术,如WMI和CIM,因此实现同一目标的方法总是不止一种。快来加入我们,学习如何选择最佳的方法来完成我们的任务。 请务必阅读本系列之前的文章: 了解如何使用PowerShell自动...