Batch file 转到在批处理脚本中无法正常工作

Batch file 转到在批处理脚本中无法正常工作,batch-file,Batch File,鉴于以下情况: @ECHO OFF SetLocal EnableDelayedExpansion cls adb shell am start -a android.intent.action.MAIN -n com.krohne.OpticheckMobile/Droid.MainActivity -e run_bb_tests true adb logcat -c set condition=false goto while :end echo macac exit

鉴于以下情况:

@ECHO OFF
SetLocal EnableDelayedExpansion

cls
adb shell am start -a android.intent.action.MAIN -n com.krohne.OpticheckMobile/Droid.MainActivity -e run_bb_tests true
adb logcat -c

set condition=false

goto while

:end
    echo macac
    exit 0


:while
    adb logcat -d -v raw | find "BBTests" | FOR /f "delims=" %%a in ('more') do ( 
        @echo Line is %%a 
        if %%a==BBTestsCompleted (  
            echo Condition met. Exiting now ..                  
            goto :end
        )
    )
goto :while

脚本不会通过:end标签退出,但它会永远循环while条件(满足if语句)

命令行下的
:while

adb logcat-d-v raw |查找“BBTests”| FOR/f“delims=“%%a in('more')do(
包含,其中每一个都会为任一侧启动一个新实例,因此管道中的
for/F
循环不会在批处理脚本运行所在的宿主
cmd.exe
实例中执行。因此,它找不到标签
:end
。此外,
cmd.exe
可以在两个上下文中运行:Command Prompt上下文和批处理文件上下文;管道创建的实例在命令提示上下文中运行,在命令提示上下文中不能使用标签,因为标签的使用仅限于批处理文件上下文,
goto
没有任何效果

要使代码正常工作,必须将
For/F
循环移动到宿主
cmd.exe
实例中。这可以通过将管道移动到由
For/F
循环执行的命令行中来实现(请注意,它们需要像
^ |
一样转义,才能从宿主
cmd.exe
实例中隐藏):

for/F“delims=“%%a in('adb logcat-d-v raw^ | find“BBTests”^ more')do(

在while类中,adb命令包含管道,这意味着如果一个命令失败,则执行另一个命令,如果该命令也失败,则执行另一个命令,这就是您无法获得所需输出的原因,因此,在:while类中单独执行每个adb命令,而不是使用管道