窗口BAT - 循环退出而不继续

时间:2017-12-08 10:19:36

标签: windows batch-file

我尝试循环数组中的所有源文件,并确保它在我设置的文件路径的文件夹中退出,下面是我的代码

@echo OFF

setlocal EnableExtensions EnableDelayedExpansion
set "string_list=A.txt B.txt C.txt D.txt"

set count=0
For %%j in (%string_list%) Do Set /A count+=1
rem echo.Total count: %count%

set current_count=0
REM for %%s in (%string_list%) do (
for %%s in (%string_list%) do (
set "var=C:\Users\ABC\Desktop\TESTING\%%s"
rem echo "!var!"

:START
if not exist "!var!" GOTO WAIT
GOTO COPY

:WAIT
timeout 5
ECHO "MISSING !var!, WAITING SOURCE FILE TO LOAD IN"
GOTO START

:COPY
ECHO "!var! FILES IS AVAIALBLE"

set /A current_count+=1
if /I %current_count%==%count% (
    echo "ALL THE FILE IS IS AVAILABLE"
) else (
    echo "CONTINUE CHECK FOR OTHER FILE"
)
)
rem echo %current_count%
pause

一旦找到第一个文件,它将退出循环。代码是检查并确保所有文件都在文件夹中,如果其中一个文件不存在,则继续循环,直到文件存在。

我不确定该函数是否可以在FOR循环中添加。

我期待着这个:

  

C:\Users\ABC\Desktop\TESTING\A.txt FILES IS AVAILABLE< - A.txt位于文件夹

中      

等待0秒,按一个键继续......

但我得到了这个:

MISSING C:\Users\ABC\Desktop\TESTING\B.txt, WAITING SOURCE FILE TO LOAD IN< - B.txt第一次不在文件夹中。

C:\Users\ABC\Desktop\TESTING\B.txt FILES IS AVAIALBLE< - B.txt位于第二个循环的文件夹中

C:\Users\ABC\Desktop\TESTING\C.txt FILES IS AVAIALBLE< - C.txt位于文件夹

C:\Users\ABC\Desktop\TESTING\D.txt FILES IS AVAIALBLE< - D.txt位于文件夹

只有当所有文件都在文件夹中时,循环才会退出,否则它将继续循环。

2 个答案:

答案 0 :(得分:3)

这是一个非常复杂的方法,无法完成一项非常简单的任务! (哦,好吧 - 我们都必须从某个地方开始)

如果说明了代码的实际目标,那将会有所帮助。事实上,我们有一个方法失败(否则毫无疑问)完成任务 - 我们必须分析代码以确定所需的任务。

从根本上说,代码失败是因为code block(带括号的命令序列)中不允许使用标签。

@echo OFF
:: switch to the destination directory as exit is required with tat directory current
cd /d "C:\Users\ABC\Desktop\TESTING"
setlocal EnableExtensions EnableDelayedExpansion
set "string_list=A.txt B.txt C.txt D.txt"

:wait
timeout /t 5 >nul
cls
for %%j in (%string_list%) do if exist "%%~j" (
 echo "%%~j" exists
) else (
 echo "%%~j" missing
 goto wait
)
echo all files found

显然,如果需要,可以在柜台加入。我添加了cls以减少屏幕混乱。如果需要,请省略。

所以 - 对于每个指定的文件(因为我们首先更改为所需的目录),看看它是否存在。如果是,请报告。否则报告它丢失并等待。重复直到找到所有。

答案 1 :(得分:1)

正如我在评论中所说的goto打破循环请参考

Batch script for loop not working

使用子程序来获得你想要的东西。我修改了以下脚本,它适用于你的情况:

@echo OFF

setlocal EnableExtensions EnableDelayedExpansion
set string_list=A.txt B.txt C.txt D.txt
set count=0
For %%j in (%string_list%) Do Set /A count+=1
echo.Total count: %count%
set current_count=0
FOR %%s in (%string_list%) DO call :workProc %%s
exit /b
:workProc
set "var=%1"
echo "hey"
echo "!var!"
:START
if not exist !var! GOTO WAIT
GOTO COPY
:WAIT
timeout 5
ECHO "MISSING !var!, WAITING SOURCE FILE TO LOAD IN"
GOTO START
:COPY
ECHO "!var! FILES IS AVAIALBLE"
set /A current_count+=1
if /I %current_count%==%count% (
    echo "ALL THE FILE IS IS AVAILABLE"
) else (
    echo "CONTINUE CHECK FOR OTHER FILE"    
    pause )
)
exit /b
rem echo %current_count%