批处理文件在启动时失败,但在我单击它时有效

Batch file fails on startup, but works when I click it

我的批处理脚本有一个小问题。这个想法很简单: 我有一个定期检查更新的应用程序(检查一个 exe 文件)。如果它找到一个,它就会下载它,重命名它并将它放在与旧文件相同的目录中。然后应用程序创建一个 .bat 文件并将其放在同一目录中。 .bat 文件的内容是:

@ECHO OFF
ECHO Waiting while old application closes...
ping 127.0.0.1 -n 5
taskkill /IM myApp.exe /f
ECHO Updating application
move /y myApp_TEMP.exe myApp.exe
START myApp.exe
pause 

在我关闭我的应用程序 (myApp.exe) 之前,我指示它执行 .bat 文件,然后等待 5 秒。所以它会正确关闭,这就是 ping 127.0.0.1 -n 5 在这里的原因。所以理想情况下,这个脚本应该:

Close myApp.exe
Rename myApp_TEMP.exe to myApp.exe
Overwrite old myApp.exe with new myApp.exe
Start myApp.exe

当我双击 .bat 文件时它工作,当我将 myApp.exe 放入 Windows 启动列表时出现问题。
所以应用程序启动、下载更新、生成 .bat 文件(请记住,一切都发生在同一目录中)然后 运行s 它。经过一番挖掘后,我发现
move /y myApp_TEMP.exe myApp.exe 行没有执行。但是当我 运行 这个脚本手动时一切正常。也许有人已经遇到过类似的问题?

您在文件名中使用了相对路径。检查它是否 运行 使用正确的当前目录或切换到绝对路径。

我建议在移动之前使用 CD /D <directory of the .exe file>,这样您就可以始终确定自己位于正确的目录中。此外,您可以使用 timeout 5 /NOBREAK 在常规批处理文件中等待 5 秒

可能需要在脚本中添加一些冗余。如:

@ECHO OFF
ECHO Waiting while old application closes...
taskkill /IM myApp.exe /f
timeout 5 /nobreak >nul
ECHO Updating application
IF EXIST "%cd%\MyApp_TEMP.exe" move /y myApp_TEMP.exe myApp.exe
IF EXIST "%cd%\MyApp.exe" GOTO STARTAPP
ECHO File not found. Unable to update.
pause
exit
:STARTAPP
START myApp.exe
pause 

问题似乎源于目录搜索的问题。虽然这可以通过相当长的搜索时间来解决,但确保批处理与 "MyApp_TEMP.exe" 位于同一目录或使用

会更容易
cd <path to MyApp_TEMP.exe>
ECHO Updating application
move /y myApp_TEMP.exe myApp.exe
START myApp.exe
pause

如果找不到文件,您也可以使用 ELSE,我只是个人更喜欢使用带有 GOTO 的标签跳转。