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命令,而不是使用管道