是否可以在Windows批处理文件中创建子菜单?

时间:2015-10-03 04:04:13

标签: windows batch-file menu cmd

我目前正在编写一个批处理文件,该文件将以脚本语言的格式输出纯文本文件,手机上的应用程序使用该文件自动执行屏幕触摸。我想要做的是创建一个子菜单,当我选择主菜单中的特定选项时调用该子菜单。所以这是我的批处理文件中的当前版本。我遇到的问题是,当我尝试创建一个子菜单时,我的操作没有被执行,它只是返回到主菜单。

这是我到目前为止所拥有的。

:MENU
ECHO.
ECHO ###################################################
ECHO # Select an Option to begin building your script  #
ECHO ###################################################
ECHO.
ECHO 1 - START
ECHO 2 - SEARCH
ECHO 3 - X_COORDINATES
ECHO 4 - Y_COORDINATES
ECHO 5 - 1
ECHO 6 - 2
ECHO 7 - 3
ECHO 8 - 4
ECHO 9 - 5
ECHO 10 - 6
ECHO 11 - 7
ECHO 12 - 8
ECHO 13 - 9
ECHO 14 - 0
ECHO 15 - QUIT
ECHO.
SET /P M=TYPE 1-15 THEN PRESS ENTER:
IF %M%==1 GOTO START
IF %M%==2 GOTO SEARCH
IF %M%==3 GOTO X_COORDINATES
IF %M%==4 GOTO Y_COORDINATES
IF %M%==5 GOTO 1
IF %M%==6 GOTO 2
IF %M%==7 GOTO 3
IF %M%==8 GOTO 4
IF %M%==9 GOTO 5
IF %M%==10 GOTO 6
IF %M%==11 GOTO 7
IF %M%==12 GOTO 8
IF %M%==13 GOTO 9
IF %M%==14 GOTO 0
IF %M%==15 GOTO QUIT

以下代码块是我遇到的问题。当选择“Y”时,它不会将touchPress 0 1315 2451sleep 590行代码行打印到我的文件中,稍后我将在应用程序中使用它来自动搜索游戏地图从头到尾无需手动键入1200x1200网格上的任何组合即可结束。它只是返回菜单,如“N”被选中。

(我选择使用@ECHO OFF作为子菜单,因为我不想混淆自己或其他任何可能使用它来编写自己的搜索脚本的人,因为它们在控制台窗口中打印之前甚至开始使用批处理文件。我只想在主菜单中选择某些选项时显示子菜单。)

@ECHO OFF
:SUB-MENU
SET /P M=TYPE Y,N THEN PRESS ENTER:
IF %M%==Y @ECHO touchPress 0 1315 2451>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
@ECHO sleep 590>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
IF %m%==N GOTO MENU

这只是重点放在批处理文件中的问题块。

ECHO.
:START
cd..
cd..
cd C:\Documents and Settings\
cd C:\Documents and Settings\Master Terminal\
cd C:\Documents and Settings\Master Terminal\Desktop\
cd C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles
@echo :start>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
GOTO :MENU
:SEARCH
@ECHO touchPress 0 493 2148>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
@ECHO sleep 590>>speedSearch.txt
GOTO :MENU
:X_COORDINATES
@ECHO touchPress 0 529 1221>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
@ECHO sleep 590>>speedSearch.txt
GOTO :MENU
:Y_COORDINATES
@ECHO touchPress 0 1131 1208>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
@echo sleep 590>>speedSearch.txt
GOTO :MENU
:1
@ECHO touchPress 0 220 1800>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
@ECHO sleep 590>>speedSearch.txt
GOTO :SUB-MENU

非常感谢任何建议。我对这个项目还有一个问题,但我想在深入研究问题之前解决这个问题。

2 个答案:

答案 0 :(得分:2)

首先,您可以使用

代替
cd..
cd..
cd C:\Documents and Settings\
cd C:\Documents and Settings\Master Terminal\
cd C:\Documents and Settings\Master Terminal\Desktop\
cd C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles

简单的单行

cd /D "C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles"

或者甚至更好

cd /D "%USERPROFILE%\Desktop\speedSearchFiles"

如果用户帐户名称为Master Terminal

其次,即使您描述批处理用户应该在提示符下输入的内容,批处理用户也可以随时按下RETURN键而不输入任何内容。因此,更好地使用默认值预定义变量。

批处理用户也可以输入任何字符串,而不仅仅是您推荐的字符串。因此,也要为任何用户输入准备批处理文件。

@ECHO OFF
:SUB-MENU
SET "M=N"
SET /P "M=TYPE Y,N THEN PRESS ENTER: "
REM Prevent a syntax error if user enters 1 or more double quotes by removing them.
SET "M=%M:"=%"
IF /I "%M%"=="Y" ECHO touchPress 0 1315 2451>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
ECHO sleep 590>>"C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles\speedSearch.txt"
GOTO MENU

yY被解释为YES,其他所有内容都被解释为NO。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • cd /?
  • echo /?
  • goto /?
  • if /?
  • rem /?
  • set /?

答案 1 :(得分:2)

虽然你的帖子很广泛但问题却很混乱;对所述问题的简短回答是:“是”。您还没有发布“子菜单问题”的单个示例;似乎你的问题与“为什么与变量的IF比较失败?”有关。你发布了一堆与问题无关的代码,所以我发布了一个与问题无关的大答案。的 ;-)

从用户获取菜单选项的最简单方法是通过choice命令;这对于用户来说更简单(只需按一个键)和程序,因为您知道choice的答案始终有效,因此无需进一步测试。

使用不同的值多次重复相同代码的最简单方法是使用array concept;这样,代码只写了一次,并通过索引从数组中选择适合每个案例的值。

以下程序与您的代码等效,但包含之前描述的概念。也许“子菜单”部分不完整,但您没有描述您的代码在哪种情况下使用“子菜单”,所以我假设是用户输入数字时。

@echo off
setlocal EnableDelayedExpansion

rem Define the array of coordinates per menu options: QBSXY1234567890
set i=2
for %%a in ("493 2148" "529 1221" "1131 1208" "220 1800" "etc...") do (
   set /A i+=1
   set "coords[!i!]=%%~a"
)

:MENU
ECHO/
ECHO ###################################################
ECHO # Select an Option to begin building your script  #
ECHO ###################################################
ECHO/
ECHO B - BEGIN
ECHO S - SEARCH
ECHO X - X_COORDINATES
ECHO Y - Y_COORDINATES
ECHO Digit between 0 and 9
ECHO Q - QUIT
ECHO/
:OPTION-0
CHOICE /C QBSXY1234567890 /N /M "SELECT OPTION: "
SET "OPTION=%ERRORLEVEL%"

rem Process options Quit and Begin
IF %OPTION% LEQ 2 GOTO OPTION-%OPTION%

rem Otherwise the option is Search, X_coords, Y_coords or a Digit:
rem get the value of the corresponding array element
ECHO touchPress 0 !coords[%OPTION%]!>> speedSearch.txt
ECHO sleep 590>> speedSearch.txt

rem If the option was Search, X_coords or Y_coords: it is complete
IF %OPTION% LEQ 5 GOTO MENU

rem Otherwise the option is a digit: enter the infamous "sub-menu"
:SUB-MENU
CHOICE /C NY /M "TYPE Y,N"
IF ERRORLEVEL 2 (
   ECHO touchPress 0 1315 2451>> speedSearch.txt
   ECHO sleep 590>> speedSearch.txt
)
GOTO :MENU

:OPTION-2  START
cd "C:\Documents and Settings\Master Terminal\Desktop\speedSearchFiles"
echo :start> speedSearch.txt
GOTO :MENU

:OPTION-1  QUIT
GOTO :EOF