gpt4 book ai didi

c# - 如何在批处理文件或 C# 中等待任务计划程序任务完成?

转载 作者:可可西里 更新时间:2023-11-01 12:45:03 24 4
gpt4 key购买 nike

我正在尝试编写一个执行两件事的批处理文件:

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

这相对简单,只是安装程序需要管理员权限并且必须在用户上下文中运行。即使有这些限制,这仍然相对简单,只是我在 Azure 辅助角色上运行它,这意味着两件事:

  1. Elevated batch files must be run from a startup task.
  2. There is no user context for startup tasks in Azure worker roles.

因此看来解决方案是 run the installer as a Task Scheduler task in a real user context 。但是,这需要注意的是,我需要等待此任务完成才能启动 program.exe。

因此,我的问题是:如何等待任务计划程序任务在批处理文件中完成?

或者,我可以在单个任务计划程序任务中以菊花链方式连接批处理文件中的两个调用(任务计划程序在单个任务中支持最多 16 个连续事件 [需要引用])。

但是,如果我采用这种方法,我的批处理文件将在任务计划后立即终止,而不是完成后立即终止。不幸的是,我必须等待它完成才能执行我的辅助角色中的任何逻辑。但是,如果我可以通过 C# 检查任务计划程序任务是否已完成(没有管理员权限),那么我就可以在那里等待。

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

编辑:我想我应该稍微澄清一下 MC ND 的以下答案:

从较高的层次来看,此命令检查任务是否正在运行,如果是,则它会休眠并循环。

: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 命令循环输出中的每一行。每行使用分隔符“:”分为两个标记。如果找到以“Status”开头的行,则该行中分隔符后面的标记将存储在变量 f 中(在上面的示例输出中将是“Ready”)。

然后检查变量 f 以查看它是否与状态“正在运行”匹配。如果状态不是“正在运行”,则假定任务已完成或失败,并且循环退出。如果状态为“正在运行”,则任务仍在运行,批处理脚本会暂停一小会儿,然后再次检查。这是通过进行 ping 调用来完成的,因为批处理没有 sleep 命令。一旦脚本完成休眠,它就会重新启动此序列。

最佳答案

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

: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
)
)

关于c# - 如何在批处理文件或 C# 中等待任务计划程序任务完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20261639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com