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

是否可以在windows批处理文件中创建子菜单?,windows,batch-file,menu,cmd,Windows,Batch File,Menu,Cmd,我目前正在编写一个批处理文件,该文件将以脚本语言的格式输出一个纯文本文件,我手机上的应用程序将使用该文件自动触摸屏幕。我想做的是创建一个子菜单,当只选择了主菜单中的特定选项时,会调用该子菜单。这是我的批处理文件的当前版本。我遇到的问题是,当我尝试创建子菜单时,我的“是”操作没有执行,它只是返回主菜单 @ECHO OFF :SUB-MENU SET /P M=TYPE Y,N THEN PRESS ENTER: IF %M%==Y @ECHO touchPress 0 1315 2451>&

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

@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
这是我到目前为止所拥有的

: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 2451
行或
sleep 590
行脚本代码打印到我的文件中,我将在应用程序中使用这些脚本代码从端到端自动搜索游戏地图,而无需手动键入1200x1200网格上的任何组合。它只是返回菜单,就像选择了“N”一样

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

这只是将重点放在批处理文件中的问题块上的休息

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

任何建议都将不胜感激。我对这个项目还有一个问题,但我想在深入研究问题之前解决这部分问题。

首先,您可以使用而不是

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"
如果用户帐户名为
主终端

第二,即使您描述了批处理用户应该在提示符下输入的内容,批处理用户也可以只按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
y
y
被解释为是,其他所有内容都被解释为否

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • cd/?
  • echo/?
  • goto/?
  • 如果/?
  • rem/?
  • 设置/?

首先,您可以使用

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"
如果用户帐户名为
主终端

第二,即使您描述了批处理用户应该在提示符下输入的内容,批处理用户也可以只按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
y
y
被解释为是,其他所有内容都被解释为否

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • cd/?
  • echo/?
  • goto/?
  • 如果/?
  • rem/?
  • 设置/?

尽管你的文章内容广泛,但这个问题相当令人困惑;对上述问题的简短回答是:“是的”。您没有发布一个“子菜单问题”的示例;您的问题似乎与“为什么与变量的IF比较失败?”有关。您发布了大量与问题无关的代码,因此我发布了大量与问题无关的答案
;-)

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

使用不同的值多次重复相同代码的最简单方法是使用;这样,代码只需编写一次,并通过索引从数组中选择适合每种情况的值

下面的程序相当于您的代码,但包含前面描述的概念。也许“子菜单”部分不完整,但您没有描述代码在哪些情况下使用“子菜单”,因此我假设用户输入数字时就是这样

@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

虽然你的文章很广泛,但这个问题相当令人困惑;对上述问题的简短回答是:“是的”。您没有发布一个“子菜单问题”的示例;您的问题似乎与“为什么与变量的IF比较失败?”有关。您发布了大量与问题无关的代码,因此我发布了大量与问题无关的答案
;-)

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

使用不同的值多次重复相同代码的最简单方法是使用;这样,代码只需编写一次,并通过索引从数组中选择适合每种情况的值

下面的程序相当于您的代码,但包含前面描述的概念。也许“子菜单”部分不完整,但是您没有描述代码在哪些情况下使用“子菜单”,所以我