是否可以从批处理文件中获取任务调度程序任务的名称 运行 批处理文件?

Is it possible, from within a batch file, to get the name of the task scheduler task running the batch file?

在 Windows 10 环境中,如果我无法访问正在执行我的 bat 文件的任务调度程序,我能否(从批处理文件中)知道具有启动批处理文件?是否有一个变量设置了我可以使用的任务计划程序任务名称?

显而易见的解决方案是在调用任务调度程序中的操作时添加任务名称参数,但是如果我无法访问任务调度程序怎么办?

我希望这个解决方案对你有用。

您可以在下面找到:

一个 .BAT 文件和一个包含函数的 .VBS。

至于.BAT:

@ECHO OFF
SET DT=%DATE% %TIME%
SET DATETIME=%DT:~0,19%
FOR /F "usebackq tokens=*" %%r in (`CSCRIPT "C:\<your_folder>\current_task_name.vbs" "%~dpnx0" "%DATETIME%"`) DO SET current_task_name=%%r
ECHO script was executed by: %current_task_name%
PAUSE

至于命名的VBS:current_task_name.vbs

getMyTask WScript.Arguments.Item(0), WScript.Arguments.Item(1)

Function getMyTask(Cmd, StartDateTime)
 ' ----------------------------------------------------------------------
 ' Script to list all Scheduled tasks and their available properties
 '   Written for TaskSchedule 2.0
 ' ----------------------------------------------------------------------
 Dim objTaskService, objTaskFolder, colTasks
 Dim objTask

 ' Create the TaskobjTaskService object and connect
 Set objTaskService = CreateObject("Schedule.Service")
 Call objTaskService.Connect

 ' Get the task folder that contains the tasks.
 Set objTaskFolder = objTaskService.GetFolder("\")
  
 ' Get all of the tasks (Enumeration of 0 Shows all including Hidden.  1 will not show hidden)
 Set colTasks = objTaskFolder.GetTasks(0)

 If colTasks.Count = 0 Then
  wscript.echo "No registered tasks."
 Else
  For Each objTask In colTasks
   With objTask
    'check if the time of execution is in the same range of the current task (~ 2 secs. after)
    If DateDiff("s", .LastRunTime, StartDateTime) <= 2 Then 
     Set objTaskDefinition = .Definition
     With objTaskDefinition
      Set colActions = objTaskDefinition.Actions
      For Each objTaskAction In colActions
       With objTaskAction
        Select Case .Type
         Case 0 '= Execute / Command Line Operation
          'If .Path of TaskAction object is equal to the batch file name provided
          'it returns its task name back
          If .Path = Cmd Then
           wscript.echo objTask.Name
           wscript.quit
          End If
        End Select
       End With
      Next
     End With
    End If
   End With
  Next
 End If
   
End Function

此致, jtandrea