Я могу определить запущенные задачи с помощью:
$TaskService = new-object -ComObject('Schedule.Service')
$TaskService.connect()
$TaskFolder = $TaskService.GetFolder('\')
$TaskFolder.gettasks(1) | ? {$_.state -eq 4}
Есть ли способ определить идентификаторы процессов этих задач, если они запускают ту же программу (т.е. имя процесса), что и другие существующие процессы?
Моя цель - сценарий PowerShell, запускаемый из запланированной задачи, который может определить, под какой запланированной задачей он выполняется. Я могу легко определить PoSh processID с помощью $PID
, но я не знаю, как связать это с конкретной запланированной задачей.
Спасибо.
2 ответа
Это должно работать, если у вас есть это в сценарии, который запускается как действие. Он получит путь к задаче, если его можно найти с помощью метода COM-объекта RunningTasks.
# 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 в MSDN
Есть кое-что, что можно сказать о другом предложении просто сообщить вашему скрипту, что выполняется, с помощью дополнительного параметра. Таким образом, вам не нужно беспокоиться о зависимости COM.
param(
[string]$SuperImportantString,
[int]$NumberofBagels,
[string]$TaskInitiated
)
Set-Content -Path $file -Value "I'm running from $TaskInitiated"
Да, это делает его более ручным, но у вас будет полный контроль над текстом и им используется, и вам не придется беспокоиться о нескольких задачах, выполняемых с одного и того же PID.
Кажется, это говорит мне, какая именно задача запустила скрипт:
$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"
Похожие вопросы
Новые вопросы
windows
Написание программного обеспечения, специфичного для операционной системы Microsoft Windows: API-интерфейсы, поведение и т. Д. ОБЩАЯ ПОДДЕРЖКА WINDOWS НЕВОЗМОЖНА. Вопросы поддержки можно задать на https://superuser.com