你如何等待任务计划任务完成batch file或C#?

我想写一个batch file,做两件事情:

  1. 首先启动安装程序(program.exe)的安装程序(install.exe)。
  2. 其次,它启动已安装程序的一个实例(program.exe)。 这必须在安装完成后执行。

除了安装程序需要pipe理员权限并且必须在用户上下文中运行,这将是相对简单的。 即使有了这些限制,这仍然是相对简单的,除了我在Azure工作者angular色上运行,这意味着两件事情:

  1. 升级的batch file必须从启动任务运行。
  2. Azure工作angular色中没有启动任务的用户上下文。

因此,看来解决scheme是在真实的用户上下文中将安装程序作为Task Scheduler任务运行 。 然而,这是伴随着我需要等待这个任务完成之前,我可以启动program.exe的警告。

因此,我的问题是:如何等待任务计划程序任务完成batch file?

或者,我可以在一个任务计划程序任务中将我的batch file中的两个调用进行菊花链连接(任务计划程序在单个任务中支持多达16个顺序事件[需要引用])。

但是,如果采取这种方法,我的batch file将在任务计划 完成后立即终止,而不是一旦完成 。 不幸的是,我必须等待它才能完成工人angular色中的任何逻辑。 但是,如果我可以检查任务计划任务是否已经从C#(无pipe理权限)完成,那么我可以在那里等待。

因此,第二个可行的答案将是这样的问题:如何检查任务计划任务是否已完成从C#?

编辑:我想我会澄清下面的答案由MC ND一点:

从高层次来看,这个命令会检查任务是否正在运行,如果是,则会hibernate并循环。

:loop for /f "tokens=2 delims=: " %%f in ('schtasks /query /tn yourTaskName /fo list ^| find "Status:"' ) do ( if "%%f"=="Running" ( ping -n 6 localhost >nul 2>nul goto loop ) ) 

调用schtasks /query /tn yourTaskName /fo list输出如下所示:

 Folder: \ HostName: 1234567890 TaskName: \yourTaskName Next Run Time: 11/27/2030 11:40:00 PM Status: Ready Logon Mode: Interactive/Background 

for命令循环输出中的每一行。 每行使用分隔符“:”分成两个标记。 如果find以“状态”开头的行,那么该行中分隔符后面的标记将存储在variablesf中(在上面的示例输出中将为“就绪”)。

然后检查variablesf,看它是否与状态“正在运行”相匹配。 如果状态不是“正在运行”,则假定任务已经完成或失败,循环退出。 如果状态为“正在运行”,那么任务仍在运行,并且批处理脚本暂停一段时间,然后再次检查。 这是通过进行ping调用来完成的,因为batch没有睡眠命令。 脚本完成睡眠后,重新启动这个序列。

从批处理文件中查询任务状态,如果正在运行,请继续查询

 :loop for /f "tokens=2 delims=: " %%f in ('schtasks /query /tn yourTaskName /fo list ^| find "Status:"' ) do ( if "%%f"=="Running" ( ping -n 6 localhost >nul 2>nul goto loop ) ) 

你也可以通过使用timeout来摆脱hacky的ping -n命令。

这是MC ND timeout的答案。 样本中的1代表1秒。

 :loop for /f "tokens=2 delims=: " %%f in ('schtasks /query /tn yourTaskName /fo list ^| find "Status:"' ) do ( if "%%f"=="Running" ( timeout /T 1 /NOBREAK > nul goto loop ) )