我可以通过以下方式确定正在运行的任务:
$PID
如果这些任务与其他现有流程启动相同的程序(即流程名称),是否有任何方法可以识别这些任务的流程ID?
我的目标是从计划任务启动的PowerShell脚本,该脚本可以识别正在运行的计划任务。我可以使用grep -cx '\s*' file
轻松确定PoSh processID,但我不知道如何将其链接到特定的计划任务。
感谢。
答案 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"