【问题标题】:Window BAT - Loop Exit Without Continue窗口 BAT - 循环退出而不继续
【发布时间】:2017-12-08 10:19:35
【问题描述】:

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

@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

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

但我明白了:

MISSING C:\Users\ABC\Desktop\TESTING\B.txt, WAITING SOURCE FILE TO LOAD IN

C:\Users\ABC\Desktop\TESTING\B.txt FILES IS AVAIALBLE

C:\Users\ABC\Desktop\TESTING\C.txt FILES IS AVAIALBLE

C:\Users\ABC\Desktop\TESTING\D.txt FILES IS AVAIALBLE

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

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

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

    如果说明代码的实际目标会有所帮助。事实上,我们有一个方法会失败(否则不会有问题)来执行任务 - 我们必须分析代码以确定所需的任务。

    从根本上说,代码失败是因为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 以减少屏幕混乱。如果需要,可以省略它。

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

    【讨论】:

      【解决方案2】:

      正如我在评论中所说,goto break for loop 请参考

      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%
      

      【讨论】:

      • 如果它再次开始循环,它将再次开始读取第一个文件,我希望它读取数组中的所有文件。但是为什么只读取第一个字符串的代码会存在数组呢?
      • 你有字符串列表 A.txt B.txt C.txt D.txt 给出文件名列表。在您的循环中创建一个带有未找到的文件名的字符串列表。如果新列表中有任何值,则循环退出时,设置原始列表的值 = 新列表并使用 goto 重置循环。此过程将继续进行,直到您有任何文件名出现在新列表中。
      • 并且不要忘记在将新列表的值转移到原始列表之后和重置循环之前将其重置为空
      • 我明白你的意思,比如从列表中删除数组。但是在搜索到第一个字符串后数组将终止的根本原因或逻辑是什么?
      • 我刚想到 GOTO 总是会中断 for 循环。给我时间我会为你写合适的脚本
      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多