Powershell如何安排工作InstanceIds工作?

时间:2015-06-26 15:40:49

标签: powershell powershell-remoting

我正在尝试使用Job-cmdlet管理预定作业的实例,例如Get-Job和Wait-Job。我遇到了问题,并且觉得我错过了一些基本的东西。

如果我想使用Job cmdlet处理预定作业实例,我发现我应该导入PSScheduledJob模块。

  

注意:要在计划作业的实例上使用Job cmdlet,必须将PSScheduledJob模块导入到会话中。要导入PSScheduledJob模块,请键入" Import-Module PSScheduledJob" (不带引号)或使用任何Scheduled Job cmdlet,例如Get-ScheduledJob。

https://technet.microsoft.com/en-us/library/hh850536.aspx

我还发现,尽管我的预期,作业实例上的Id属性并不是全局识别它 - 而是在单个Powershell会话中。

  

ID是一个整数,用于唯一标识当前会话中的作业。它比实例ID更容易记住和输入,但它仅在当前会话中是唯一的。

https://technet.microsoft.com/en-us/library/hh849693.aspx

InstanceId应该是全球唯一的,听起来不错......

  

实例ID是唯一标识作业的GUID   计算机。

https://technet.microsoft.com/en-us/library/hh849693.aspx

...但我似乎得到了返回不同InstanceIds的相同作业实例。以下脚本直接和通过远程处理获取作业的InstanceIds。

Import-Module PSScheduledJob;
$localInstanceIds = ( get-job -Name $jobName).InstanceId.Guid

$remoteInstanceIds = (invoke-command -ComputerName . -ArgumentList $jobName -ScriptBlock {
    param([string]$jobName)

    Import-Module PSScheduledJob;
    (get-job -Name Midwinter.AdviceOS.Reports.SsfsTestA).InstanceId.Guid
})

Compare-Object $localInstanceIds $remoteInstanceIds

请注意,在输出中,每个方法都返回了两个作业,但没有InstanceId匹配。

InputObject                                                      SideIndicator                                                   
-----------                                                      -------------                                                   
780df0f3-bfc1-4fef-80f5-730e8cbcc548                             =>                                                              
44109202-cb9b-43cb-8447-7e48905f10a7                             =>                                                              
4fe8efaa-3107-43cd-a55e-b457b3be5993                             <=                                                              
ad3bac3f-9f80-4ccd-b8d9-60c1b49fcf6a                             <=                                                              

我还发现计划的作业实例保存在创建它们的用户的配置文件中的文件系统上。

  

创建预定作业时,Windows Powershell会创建一个   中的预定作业的目录   $ HOME \应用程序数据\本地\微软\的Windows \ PowerShell的\ ScheduledJobs   本地计算机上的目录。目录名称与   工作名称。

https://technet.microsoft.com/en-us/library/hh849673.aspx

以下脚本从该路径中的给定作业的Status.xml文件中检索所有InstanceIds,并将它们与使用Get-Job cmdlet返回的InstanceIds进行比较。

Import-Module PSScheduledJob;
$paths = "C:\Users\$userName\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\$jobName\Output\*\Status.xml";

$namespace = @{ns = 'http://schemas.datacontract.org/2004/07/Microsoft.PowerShell.ScheduledJob'};

$instanceIdsFromFileSystem = (Select-Xml -Path $paths -XPath '/ns:StatusInfo/Status_InstanceId/text()' -Namespace $namespace).Node.Value

$instanceIdsFromCmdlet = (Get-Job -Name $jobName).InstanceId

compare-object $instanceIdsFromFileSystem $instanceIdsFromCmdlet -IncludeEqual

输出再次显示没有匹配。

InputObject                                                      SideIndicator                                                   
-----------                                                      -------------                                                   
4fe8efaa-3107-43cd-a55e-b457b3be5993                             =>                                                              
ad3bac3f-9f80-4ccd-b8d9-60c1b49fcf6a                             =>                                                              
e81731dd-4159-476d-937e-7a066d082eb6                             <=                                                              
5ea34723-ab39-4949-b302-c4be1b1588bb                             <=                                                              

有人可以帮我解释一下吗?

1 个答案:

答案 0 :(得分:0)

InstanceId是在运行时生成的GUID - 它确实识别作业(&#34;全局&#34;在主机上,但不是普遍的),但不识别作业的内容。

您执行的任何作业都将分配一个随机GUID,它们不能用于在会话,主机甚至单个执行中持久识别任何作业。如果您执行两次相同的作业,它们将具有不同的InstanceId属性。这是设计的。

如果要为作业创建永久标识符,可以使用“名称”属性。