我需要一些帮助,如何循环访问未设置或未输入的变量的set/p。我下面的代码部分工作,除了如果所有设置的/p 变量都输入了它将运行无限循环的部分,我认为这是因为在标签内调用标签
以下是我想要的假设您询问的名字和姓氏:
Enter First Name:
Enter Last Name: Bill
Enter 1 to Continue: 1
现在,当它被处理并且批处理检测到名字被清空时,它将返回并提示那些为空或尚未设置的变量。
@echo off
SetLocal EnableDelayedExpansion
set name=
set age=
set gender=
set pick= "enter 1 to register: "
if %pick% EQU 1 goto getch
:getch
cls
if not defined name (set /p name= "Enter name: ") else ( echo Name: !name!)
if not defined age (set /p age= "Enter age: ") else (echo Age: !age!)
if not defined gender (set /p gender= "Enter gender: ") else (echo Gender: !gender!)
goto getch
pause
在第二部分中,您不需要设置已经设置的VAR
@echo off
set name=
set age=
set gender=
:getch
cls
if not defined name (set /p name= "Enter name: ")
if not defined age (set /p age= "Enter age: ")
if not defined gender (set /p gender= "Enter gender: ")
pause
为了确保所有VAR
都将真正设置:
@echo off
set name=
set age=
set gender=
:getch
cls
if not defined name (set /p name= "Enter name: ")
if not defined name goto:getch
if not defined age (set /p age= "Enter age: ")
if not defined age goto:getch
if not defined gender (set /p gender= "Enter gender: ")
if not defined gender goto:getch
pause
if not defined gender (set /p gender= "Enter gender: ") else (echo Gender: !gender!)
IF DEFINED NAME IF DEFINED AGE IF DEFINED GENDER GOTO ALLDONE
goto getch
:ALLDONE
echo all done
输入每个变量后,原始代码将在循环中执行cls/echo
,因为无法退出循环。
另一种更简单的方法是更换
goto getch
跟
for %%a in (name age gender) do if not defined %%a goto getch
第三种方式是:
if not defined name (set /p name= "Enter name: "&GOTO GETCH) else ( echo Name: %name%)
(并对其他两个变量重复此操作( - 然后删除最后的goto getch
。这将执行的操作是显示已输入的每个值,并提示输入任何尚未输入的值。当用户响应时,代码会重新执行cls
并显示条目,并在任何空值处停止。请注意,&
可用于连接一系列命令。
顺便说一句 - !var!
在您的echo
中不是必需的,因为您没有更改代码块中变量的值。
也
if "%pick%" EQU "1" goto getch
将提供一些针对意外用户输入的保护。