更新:
为了实现您的目标,我建议将您的批次变成Service。(此处的文档)通过将您的批次转换为服务,它不再受用户登录、权限问题的影响,它将作为 SYSTEM ACCOUNT 运行。这本身可以减轻对这个过程的很多愤怒。
完成后,您可以编写一个批处理文件来确保您的服务确实在运行。您当前的问题是它不会自动重新启动。好吧,服务总是运行——即使它有错误,它仍然会尝试运行。
这意味着除非它有一个致命的异常,否则您的服务应该始终工作-但可以肯定的是,您可以创建一个批处理来确保您的服务正在运行。
一个例子:
:START
timeout 3600
for /F "tokens=3 delims: " %%H in ('sc query "MyServiceName" ^| findstr "
if /I "%%H" NEQ "RUNNING" (
NET START "MyServiceName"
REM Service has Started...
)
)
GOTO START
所以理论上每 3,600 秒它会测试你的服务是否正在运行,如果不是,它会为你启动服务。
重要提示:
这是解决问题的正确方法,而不是规避它。但是,正如我所指出的,您的批次仍应Exception Handling
确保您的应用程序不会陷入无法使用的状态。这仍然不是最好的方法,因为它应该请求Exception Handling
并Verification
测试它的状态。
正如我之前提到的,您有很多方法可以解决您的问题。但是,你的思维是线性思维。意思是:
- 执行命令,保证目标。
- 如果我这样做,就会发生这种情况。
基本上基于我看到的最小示例,您似乎已经创建了一个无限循环来不断执行您的命令。我的问题是:当你的循环出现错误时,它如何继续运行?
您已经说过它发生在随机区域 - 没有什么是随机的,那些更有可能需要一些验证/测试以确保它保持在正确状态的区域。 识别潜在问题的速度越快,您的程序就可以越有效地运行而不会出现错误。
希望这会有所帮助-
您的批处理应用程序到底是做什么的?
我问的原因是因为您可以绕过Windows 任务计划程序的问题,它允许您配置一些参数以根据您指定的条件 自动启动和自动打开特定应用程序。会很理想吗?它会真正根据您的需求实现自动化吗?更可能不会。
正如 GolezTrol 上面提到的,错误的原因将是解决问题的更重要方面。根据你的评论
老实说,每次的错误都是不同的。
这可能表明批处理脚本不遵守测试,而是假设它成功完成。没有任何下划线信息,例如:
- 功能
- 代码示例
- 发生错误的位置,以及在什么任务期间。
这使得为您指明正确的方向变得相对困难。我会考虑的一件事是IF。这是一项基本的任务,但非常重要——
if(Directory.Exists(dirName))
{
// Do This
}
else
{
// Do This
}
我发现C#大纲是一种更容易理解IF用途的方法。您实际上可以在您的批处理中实现类似的东西。你会像这样完成它:
if exist { insert file name } (
rem file exists
) else (
rem file doesn't exists
)
或者你可以像这样完成它:
if exists c:\myFile.bat notepad c:\myFile.bat
如果C:\myFile.bat
存在,则打开记事本。这是一个重要的原因是因为如果变量不存在,那么它不会受到影响。这允许您的应用程序基本上以非常原始的方式做出决策。
你有相当多的灵活性——有很多关于这个主题的例子,因为批处理编程已经存在了很长时间。另一种选择是最终转移到Powershell。它将有权访问Windows 管理界面 (WMI)。
希望这会为您指明正确的方向,如果没有更多信息,我们的答案可能不会有太大帮助。