File 崩溃/错误时重新启动批处理文件

File 崩溃/错误时重新启动批处理文件,file,batch-file,File,Batch File,我有一个批处理文件,它遇到了几个错误。这些错误要求强制关闭命令提示符。这导致我不得不再次打开该文件以修复该问题 由于该应用程序的性质,它需要一直运行 我正在寻找一种方法,当文件遇到错误时自动重新启动它。有我可以用的命令吗 您能否详细描述一下,以及为什么该命令可以实现这样的解决方案?更新: 为了实现您的目标,我建议您将批处理转化为服务。()通过将批处理转换为服务,它将不再受用户登录、权限问题的影响,它将作为系统帐户运行。这本身就可以减轻对这个过程的愤怒 完成后,您可以编写一个批处理文件,以确保您的

我有一个批处理文件,它遇到了几个错误。这些错误要求强制关闭命令提示符。这导致我不得不再次打开该文件以修复该问题

由于该应用程序的性质,它需要一直运行

我正在寻找一种方法,当文件遇到错误时自动重新启动它。有我可以用的命令吗


您能否详细描述一下,以及为什么该命令可以实现这样的解决方案?

更新:

为了实现您的目标,我建议您将批处理转化为服务。()通过将批处理转换为服务,它将不再受用户登录、权限问题的影响,它将作为系统帐户运行。这本身就可以减轻对这个过程的愤怒

完成后,您可以编写一个批处理文件,以确保您的服务确实在运行。您当前的问题是,它不会自动重新启动。嗯,服务总是运行的——即使它有错误,它仍然会尝试运行

这意味着,除非它有一个致命异常,否则您的服务应该始终正常工作-但为了确定,您可以创建一个批处理来确保您的服务正在运行

例如:

 :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
因此,理论上每3600秒,它将测试您的服务是否正在运行,如果没有,它将为您启动服务

重要提示: 这是解决问题的更恰当的方法,而不是回避问题。然而,正如我所指出的,您的批处理仍然应该执行
异常处理
,以确保您的应用程序不会陷入无法使用的状态。这仍然不是最好的方法,因为它应该执行
异常处理
验证
来测试它的状态

正如我前面提到的,你有很多方法来解决你的问题。然而,你的思维方式是线性的。这意味着:

  • 执行命令,目标得到保证
  • 如果我这样做,这种情况就会发生
基本上基于我看到的最小示例,看起来您已经创建了一个无限循环来持续执行您的命令。我向您提出的问题:当您的循环出现错误时,它如何继续运行?

您已经说过,它发生在随机区域-没有什么是随机的,这些区域更可能需要一些验证/测试,以确保它保持在适当的状态识别潜在问题的速度越快,您的程序运行就越有效,不会出现错误。

希望这能有所帮助-


批处理应用程序的具体功能是什么

我之所以问这个问题,是因为您可以通过Windows任务调度器绕过这个问题,它允许您配置一些参数,以便根据指定的条件自动启动和自动打开特定的应用程序。是否理想?它会真正自动满足您的需求吗

正如GolezTrol前面提到的,错误的原因将是解决问题的更重要方面。根据你的评论

老实说,每次的错误都不一样

这可能表明批处理脚本没有坚持测试,而是假设它成功完成。没有任何下划线信息,例如:

  • 作用
  • 代码示例
  • 发生错误的位置和任务期间
这使得你相对难以找到正确的方向。我要考虑的一件事是<强> < <强> >。这是一项基本任务,但相当重要-

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
或者你可以这样做:

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)

希望这能为你指明正确的方向,如果没有更多的信息,我们的答案可能不会有多大帮助



更新:

为了实现您的目标,我建议您将批处理转化为服务。()通过将批处理转换为服务,它将不再受用户登录、权限问题的影响,它将作为系统帐户运行。这本身就可以减轻对这个过程的愤怒

完成后,您可以编写一个批处理文件,以确保您的服务确实在运行。您当前的问题是,它不会自动重新启动。嗯,服务总是运行的——即使它有错误,它仍然会尝试运行

这意味着,除非它有一个致命异常,否则您的服务应该始终正常工作-但为了确定,您可以创建一个批处理来确保您的服务正在运行

例如:

 :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
因此,理论上每3600秒,它将测试您的服务是否正在运行,如果没有,它将为您启动服务

重要提示: 这是解决问题的更恰当的方法,而不是回避问题。然而,正如我所指出的,您的批处理仍然应该执行
异常处理
,以确保您的应用程序不会陷入无法使用的状态。这仍然不是最好的方法,因为它应该执行
异常处理
验证
来测试它的状态

正如我提到的b