极客学校:了解如何在PowerShell中使用作业

PowerShell有四种类型的作业-后台作业、远程作业、WMI作业和计划作业。欢迎加入我们的行列,了解它们是什么以及我们如何使用它们。

请务必阅读本系列的前几篇文章:

了解如何使用PowerShell自动化Windows。 学习在PowerShell中使用Cmdlet。 了解如何在PowerShell中使用对象。 在PowerShell中学习格式化、筛选和比较。 学习在PowerShell中使用远程处理。 使用PowerShell获取计算机信息。 在PowerShell中使用集合

在接下来的一周里,我们将继续关注这一系列的节目。

后台作业

到目前为止,我在PowerShell中向您展示的所有内容都是同步的,这意味着我们在shell中键入一些内容,在该命令执行完毕之前,实际上不能做太多事情。这就是后台工作的用武之地。要启动后台,作业只需将脚本块传递给Start-Job cmdlet。

现在,当该脚本块在后台执行时,我们可以在shell中随意执行任何操作。

启动新作业时,PowerShell会创建一个表示该作业的新作业对象。您可以通过运行Get-Job cmdlet随时获取所有作业的列表。

作业对象告诉您作业的状态。例如,在上面的屏幕截图中我们可以看到,我们有一个名为GetFileList的Background Job,它仍在运行,但已经开始返回数据。如果您在任何时候确定作业已经运行了太长时间,您可以通过管道将其发送到Stop-Job来轻松地停止它。

但是,一旦您停止了作业,在您停止该作业之前它接收到的任何数据都仍然可用。不过,还是有个问题。在PowerShell中,一旦您收到作业的结果,它们就会被删除。为了保留它们,您必须指定Receive-Job的Keep开关参数。

完成作业后,最佳做法是删除该作业。要删除作业,只需通过管道将其传递给Remove-Job cmdlet。

这会将其从Get-Job返回的作业列表中删除。

远程作业

几节课之前,我们了解了如何使用Invoke-Command使用远程处理在远程计算机上执行PowerShell命令,但是您知道您也可以使用Invoke-Command在后台启动远程处理作业吗?要执行此操作,只需将-AsJob参数添加到命令的末尾:

这是一个简单的命令,现在应该已经执行完毕,所以让我们来看看我们的作业状态。

嗯,看起来失败了。这让我想到了我在工作方面的第一个难题。在PowerShell中创建任何类型的新作业时,除了为您运行作业的每台计算机创建一个子作业外,还会创建一个父作业。使用Get-Job cmdlet时,它仅显示父作业,状态属性是最坏情况方案,这意味着即使命令仅在一百台计算机中的一台上运行失败,父作业状态也会显示为失败。要查看子作业列表,需要使用IncludeChildJob参数。

如果仔细观察,您会发现该作业确实只在一台计算机上失败,这将我们带到下一个问题。当您尝试获取作业的结果时,如果指定父作业的名称或ID,PowerShell将返回所有子作业的数据。问题是,如果某个子作业中有错误,我们会留下一些红色文本。

有两种方法可以绕过这个问题。首先,如果您知道要为哪些计算机获取结果,只需使用Receieve-Job cmdlet的ComputerName参数即可。

或者,您可以使用特定子作业的作业ID获取结果。

WMI作业

WMI作业与远程作业基本相同,只需要将-AsJob参数添加到Get-WmiObject cmdlet。

不幸的是,这意味着它们也会受到我在远程作业一节中提到的相同问题的影响。

计划的作业

我们查看的最后三种作业不是永久性的,这意味着它们仅在您的当前会话中可用。基本上,这意味着如果您启动一个作业,然后打开另一个PowerShell控制台并运行Get-Job,您将不会看到任何作业。但是,返回到启动作业的控制台,您将能够看到其状态。这与持久的计划作业不同。基本上,计划作业是按计划运行的脚本块。在过去,使用Windows Task Scheduler可以达到同样的效果,这实际上就是在幕后发生的事情。要创建新的计划作业,请执行以下操作:

这个命令中有相当多的内容,所以让我们把它分解一下。

首先,我们将计划作业的名称命名为GetEventLogs。 然后我们告诉它,当被触发时,我们希望它运行指定脚本块的内容,这基本上会获得安全事件日志的最新100个条目。 接下来,我们指定一个触发器。由于Trigger参数接受触发器对象作为输入,因此我们使用了一个括号命令来生成触发器,该触发器将在每天下午5点触发。 由于我们正在处理事件日志,因此需要以管理员身份运行,我们可以通过创建新的ScheduledJobOption对象并将其传递给ScheduledJobOption参数来指定管理员身份。

由于这是一种略有不同的作业类型,因此您还需要使用不同的命令来检索计算机上所有计划作业的列表。

非那样做不行。

相关文章