如何找到 运行 计划任务的进程 ID?
How to find the process ID of a running scheduled task?
我可以确定 运行 个任务:
$TaskService = new-object -ComObject('Schedule.Service')
$TaskService.connect()
$TaskFolder = $TaskService.GetFolder('\')
$TaskFolder.gettasks(1) | ? {$_.state -eq 4}
如果这些任务启动与其他现有进程相同的程序(即进程名称),是否有任何方法可以识别这些任务的进程 ID?
我的目标是一个从计划任务启动的 PowerShell 脚本,它可以识别它在哪个计划任务下 运行。我可以使用 $PID
轻松确定 PoSh processID,但我不知道如何 link 将其用于特定的计划任务。
谢谢。
这似乎准确地告诉了我哪个任务启动了脚本:
$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"
如果脚本中有此 运行 作为动作触发,这应该有效。它将获取任务路径,假设它可以通过 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
归功于 for pointing out the method and linking to the ITaskService interface on MSDN
关于仅通过额外参数告诉您的脚本什么是 运行 的其他建议,还有一些话要说。这样您就不必担心 COM 依赖性。
param(
[string]$SuperImportantString,
[int]$NumberofBagels,
[string]$TaskInitiated
)
Set-Content -Path $file -Value "I'm running from $TaskInitiated"
是的,这确实使它更加手动,但您可以最终控制文本和所使用的内容,而不必担心来自同一 PID 的多个任务 运行。
我可以确定 运行 个任务:
$TaskService = new-object -ComObject('Schedule.Service')
$TaskService.connect()
$TaskFolder = $TaskService.GetFolder('\')
$TaskFolder.gettasks(1) | ? {$_.state -eq 4}
如果这些任务启动与其他现有进程相同的程序(即进程名称),是否有任何方法可以识别这些任务的进程 ID?
我的目标是一个从计划任务启动的 PowerShell 脚本,它可以识别它在哪个计划任务下 运行。我可以使用 $PID
轻松确定 PoSh processID,但我不知道如何 link 将其用于特定的计划任务。
谢谢。
这似乎准确地告诉了我哪个任务启动了脚本:
$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"
如果脚本中有此 运行 作为动作触发,这应该有效。它将获取任务路径,假设它可以通过 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
归功于
关于仅通过额外参数告诉您的脚本什么是 运行 的其他建议,还有一些话要说。这样您就不必担心 COM 依赖性。
param(
[string]$SuperImportantString,
[int]$NumberofBagels,
[string]$TaskInitiated
)
Set-Content -Path $file -Value "I'm running from $TaskInitiated"
是的,这确实使它更加手动,但您可以最终控制文本和所使用的内容,而不必担心来自同一 PID 的多个任务 运行。