使用Windows批处理脚本检查当前正在使用的文件

时间:2015-11-02 21:35:18

标签: windows batch-file jenkins

我试图创建一个批处理脚本来检查目录中的每个文件,然后等待其中一个文件当前正由Windows中的进程使用。此解决方案基于this answer from stackoverflow。目标是在使用MSDeploy部署应用程序之前在Jenkins中执行以下脚本,以确保应用程序文件夹中没有使用dll:

FOR /F "delims=" %%A in ('dir C:\Folder\%1\*.dll /b') do (
:TestFile
ren C:\Folder\%1\%%A C:\Folder\%1\%%A
IF errorlevel 0 GOTO Continue
ping 127.0.0.1 -n 5 > nul
GOTO TestFile
:Continue
)

但是,当运行此脚本时,无论是作为独立脚本还是通过Jenkins Windows Command步骤,它在执行FOR循环时都会显示以下错误:

Warning: ) was unexpected at this time. 

这个错误背后的原因是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用goto打破for的循环上下文;这会导致您描述的错误。要解决这个问题,您可以将代码从for的主体移动到批处理脚本末尾的子例程中,并使用call为每个循环迭代执行它。在exit /B循环后,for必须在循环完成迭代后无意中落入子例程。

另一个问题是ren命令的错误检查,因为条件if ErrorLevel 0对于等于大于{{1}的ErrorLevel为真}};所以逻辑需要更改为0,如果if not ErrorLevel 1小于ErrorLevel,则为真。

这是固定代码(您会注意到,我在路径周围添加了一些引号,并且我对某些参数使用了1修饰符;这样做是为了保证包含<的路径不会出现问题em> spaces 或其他一些特殊字符):

~

for /F "delims=" %%A in ('dir /B "C:\Folder\%~1\*.dll"') do ( rem the processed items of the original code are passed as arguments: call :TestFile "%~1" "%%~A" ) exit /B :TestFile rem the delivered arguments can be accessed by `%1` and `%2` here: 2> nul ren "C:\Folder\%~1\%~2" "%~2" if not ErrorLevel 1 goto :EOF > nul ping 127.0.0.1 -n 5 goto :TestFile 命令的重定向2> nul可以避免显示任何错误消息。