更新:
为了实现您的目标,我建议将您的 batch 变成 Service。 (Documentation here) 通过将您的 batch 转换为 Service 它不再受用户登录、权限问题的影响,它将作为系统帐户运行。这本身就可以减轻很多对流程的愤怒。
完成之后,您可以编写一个 batch 文件来确保您的 Service 确实在运行。您当前的问题是它不会自动重新启动。好吧,Service 总是会运行——即使它有错误,它仍然会尝试运行。
这意味着除非它有 Fatal Exception,否则您的 Service 应该始终有效 - 但可以肯定的是,您可以创建一个 batch 来确保您的服务正在运行。
一个例子:
: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 秒它会测试您的 Service 是否正在运行,如果不是,它将为您启动 Service。
重要:
这更适合解决您的问题,而不是规避它。但是,正如我所指出的,您的 batch 仍应请求Exception Handling 以确保您的应用程序不会陷入不可用状态。这仍然不是最好的方法,因为它应该请求 Exception Handling 和 Verification 来测试它的状态。
正如我之前提到的,您有很多方法可以解决您的问题。但是,您的想法是线性思维模式。这意味着:
- 执行命令,保证目标。
- 如果我这样做,就会发生这种情况。
基本上基于我看到的最小示例,您似乎创建了一个无限循环来不断执行您的命令。我的问题是:当你的循环出现错误时,它如何继续运行?
您已经说过它发生在随机区域 - 没有什么是随机的,那些更有可能需要一些验证/测试以确保它保持在正确状态的区域。 您发现潜在问题的速度越快,您的程序就能越有效地运行而不会出现错误。
希望对你有所帮助-
您的批处理应用程序究竟是做什么的?
我问的原因是因为您可以使用 Windows 任务计划程序 来规避这个问题,它允许您根据您的情况配置一些参数来自动启动和自动打开规定的标准。 会很理想吗?它会真正根据您的需求实现自动化吗?很有可能不会。
正如 GolezTrol 上面提到的,您的错误原因将是解决您的问题的更重要方面。根据您的评论
说实话,每次的错误都不一样。
这可能表明批处理脚本不遵守测试,而是假设它成功完成。没有任何下划线信息,例如:
这让你很难找到正确的方向。我会考虑的一件事是IF。这是一项基本任务,但非常重要-
if(Directory.Exists(dirName))
{
// Do This
}
else
{
// Do This
}
我发现C# 大纲是一种更容易理解IF 用途的方法。您实际上可以在 batch 中实现类似的东西。你可以这样完成它:
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)。
希望这会为您指明正确的方向,如果没有更多信息,我们的答案可能不会有太大帮助。