检测文件是否在批处理文件中打开

时间:2011-08-06 22:34:26

标签: windows batch-file cmd rename errorlevel

假设我有一个用于执行长版本的批处理文件,最后它会创建一个EXE。如果我在开始构建之前忘记关闭应用程序,则链接阶段会在无法重新创建EXE时失败。

我想检查EXE是否在构建的 start 处打开。我尝试将EXE文件重命名为自身,但是虽然这会给出拒绝访问错误,但重命名命令(作为内部命令)不会设置%ErrorLevel%。

检查将%ErrorLevel%设置为非零值的打开文件的非破坏性方法是什么?

3 个答案:

答案 0 :(得分:8)

重命名方法对我不起作用(在Windows XP SP3上测试)。我开始一个任意的应用程序,并试图将其重命名为自己。没有错误,没有任何影响。

然而,这种方法确实有效:

COPY /B app.exe+NUL app.exe

当应用程序运行时,此命令产生了一条错误消息。当应用程序未被授权时,不仅此命令保留了文件的内容,而且还使修改时间戳保持不变。

因此,如果我是你,我可能会以这种方式使用此命令(在批处理脚本的开头,就像你说的那样):

COPY /B app.exe+NUL app.exe >NUL || (GOTO :EOF)

如果前一个命令失败,则||运算符将控件传递给它旁边的命令/块(提高错误级别值)。因此,如果COPY失败,上述命令将终止脚本(如果文件打开,它将会终止)。

将保留错误消息(因为此类消息通常发送到所谓的标准错误设备,并且不会被>NUL重定向丢弃,而其他非错误消息通常会发送到标准输出因此可以用>NUL来抑制,并作为脚本提前终止的解释。但是,如果您想要显示自己的消息,可以尝试这样的事情:

COPY /B app.exe+NUL app.exe >NUL 2>NUL || (ECHO Target file inaccessible& GOTO :EOF)

虽然>NUL隐藏了发送到标准输出的内容,2>NUL会对标准错误执行相同的操作。

答案 1 :(得分:1)

@echo off

:start
ren filename filename        // rename file to same name
if errorlevel 1 goto errorline
echo command successfull file is not in use anymore
goto end
:errorline
echo Rename wasnt possible, file is in use try again in 5seconds
timeout /T 5
goto :start
:end
exit

将文件重命名为相同的名称,如果可能,脚本跳转到结束哪些退出代码,另外它会生成错误代码1并跳转到错误行,在超时5秒后跳转到:start和脚本从开始开始。

答案 2 :(得分:1)

找到更好的方法:

:start
timeout /T 5

if exist %1 (
2>nul (
  >> %1  (call )
) && (goto ende) || (goto start) ) else ( exit )


:ende
YourCode

这将在5秒后检查“是否正在使用文件”,如果它将再次启动。如果没有,它会变成你可以做下一个选择的地方

相关问题