我正在编写一个Windows批处理脚本,它编译作为参数传递给它的文件。这就是我想要做的事情:
这是我迄今为止所能提出的:
输入:要编译的文件的完整路径列表。
示例:" D:/dir1/dir2/file1.cxx" " d:/dir1/dir3/file2.cxx"
@echo off
REM -- loop over each argument --
for %%I IN (%*) DO (
cd %%~dpI
call :loop
echo "After subroutine"
)
exit /b
:loop
REM -- NOTE: Infinite loop, breaks out when root directory is reached --
REM -- or makefile is found --
for /L %%n in (1,0,10) do (
if exist "makefile" (
echo "Building.."
make -s
echo "Exiting inner loop"
exit /b 2
) else (
if "%cd:~3,1%"=="" (
echo "Reached root...exiting inner loop..."
exit /b 2
)
REM -- Go to parent directory --
cd ..
echo "Searching one level up"
)
)
除此之外的一切都有效 - 在遇到第一个' makefile'后,' 退出/ b 2 '导致批处理文件退出。我想要的是只有内循环应该退出。 ' 退出/ b 2 '应该根据this工作,但由于某种原因,它不是。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
您的代码中存在一些问题。不太重要的一点是内循环中当前目录的比较必须通过延迟扩展来完成。现在重要的一个:
无法使用for /L
命令中断exit /B
循环。虽然循环中exit /B
之后的任何命令都不再执行,但循环永远不会结束。您必须使用普通exit
命令执行此操作,但当然整个cmd.exe会话也由exit
终止,因此解决方案是启动第二个 cmd。 exe会话重新执行由特殊参数控制的相同批处理文件:
@echo off
REM If this batch file was re-executed from itself: goto right part
if "%~1" equ ":loop" goto loop
REM -- loop over each argument --
for %%I IN (%*) DO (
cd %%~dpI
REM Execute the "subroutine" in a separate cmd.exe session
cmd /C "%~F0" :loop
echo "After subroutine"
)
exit /b
:loop
setlocal EnableDelayedExpansion
REM -- NOTE: Infinite loop, breaks out when root directory is reached --
REM -- or makefile is found --
for /L %%n in () do (
if exist "makefile" (
echo "Building.."
make -s
echo "Exiting inner loop"
exit
) else (
if "!cd:~3,1!" equ "" (
echo "Reached root...exiting inner loop..."
exit
)
REM -- Go to parent directory --
cd ..
echo "Searching one level up"
)
)
编辑:添加了评论
当您使用无限循环时,更清楚的是不在括号中包含任何值;否则你似乎在" 0"增量。
此处显示的链接上显示的EXIT命令说明不正确...