如何查找正在运行的计划任务的进程ID?

时间:2018-03-13 16:00:22

标签: windows powershell scheduled-tasks taskscheduler

我可以通过以下方式确定正在运行的任务:

$PID

如果这些任务与其他现有流程启动相同的程序(即流程名称),是否有任何方法可以识别这些任务的流程ID?

我的目标是从计划任务启动的PowerShell脚本,该脚本可以识别正在运行的计划任务。我可以使用grep -cx '\s*' file轻松确定PoSh processID,但我不知道如何将其链接到特定的计划任务。

感谢。

2 个答案:

答案 0 :(得分:2)

如果您在作为操作触发的脚本中运行此操作,则此操作应该有效。假设可以通过RunningTasks COM对象方法

找到它,它将获得任务路径
# Initiate a COM object and connect
$TaskService = New-Object -ComObject('Schedule.Service')
$TaskService.Connect()

# Query for currently running tasks 
# 0 - the user is permitted to see. 
# 1 - 0 + Hidden
$runningTasks = $TaskService.GetRunningTasks(0)

# Get the task associated to a certain PID
$runningTasks | Where-Object{$_.EnginePID -eq $PID} | Select-Object -ExpandProperty Path

信用转到eryksun指出方法并链接到ITaskService interface on MSDN

关于通过额外参数告诉你的脚本运行什么的另一个建议,有一些话要说。这样你就不必担心COM依赖。

param(
  [string]$SuperImportantString,
  [int]$NumberofBagels,
  [string]$TaskInitiated
)

Set-Content -Path $file -Value "I'm running from $TaskInitiated"

是的,这确实使它更加手动,但您可以对文本和使用过的文本进行最终控制,而不必担心从同一个PID运行的多个任务。

答案 1 :(得分:0)

这似乎告诉我确切的任务启动了脚本:

$EventFilter = @{ 
              Logname      = 'Microsoft-Windows-TaskScheduler/Operational'
              ProviderName = "Microsoft-Windows-TaskScheduler"
              Id           = 129
              Data         = "$PID"
           }

$ThisProcessEvent = Get-WinEvent -FilterHashtable $EventFilter -MaxEvents 1 -ErrorAction SilentlyContinue

$EventXML = [xml]$ThisProcessEvent.toxml()

$TaskFullName = $eventxml.event.eventdata.data | ? {$_.name -eq 'taskname'} |select -ExpandProperty "#text"