我试图创建一个批处理脚本来检查目录中的每个文件,然后等待其中一个文件当前正由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.
这个错误背后的原因是什么?
谢谢!
答案 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
可以避免显示任何错误消息。