1

I have a batch file that encounters several errors. These errors require the command prompt to be forcefully closed. Which causes me to have to open the file again to fix the issue.

Due to the nature of this application it is required to run all the time.

I'm looking for a way to automate the file to restart when it encounters an error. Is there a command I can do this with?

Could you please describe in detail and why the command accomplishes such a resolution?

4

3 回答 3

5

更新:

为了实现您的目标,我建议将您的批次变成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 HandlingVerification测试它的状态。

正如我之前提到的,您有很多方法可以解决您的问题。但是,你的思维是线性思维。意思是:

  • 执行命令,保证目标。
  • 如果我这样做,就会发生这种情况。

基本上基于我看到的最小示例,您似乎已经创建了一个无限循环来不断执行您的命令。我的问题是:当你的循环出现错误时,它如何继续运行?

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

希望这会有所帮助-


您的批处理应用程序到底是做什么的?

我问的原因是因为您可以绕过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)

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


于 2013-07-10T17:24:28.537 回答
1

我相信,最简单的方法是使用 GOTO 语句再创建一个.bat文件:

@echo off
:startover
echo (%time%) App started.
call "c:\app.bat"
echo (%time%) WARNING: App closed or crashed, restarting.
goto startover
于 2018-03-30T00:12:40.920 回答
0

这可能会解决您的问题:

http://nssm.cc/usage

基本上它所做的就是向 nssm 添加一些 bat 文件并使其成为服务。

在“退出操作”部分中它说:

要配置应用程序退出时 nssm 应采取的操作,请编辑键HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppExit的默认值。如果 nssm 运行时注册表中不存在该键,它将创建它并将值设置为Restart

于 2013-07-10T18:27:52.363 回答