循环遍历 set /p 变量(如果未定义)



我需要一些帮助,如何循环访问未设置或未输入的变量的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

将提供一些针对意外用户输入的保护。

最新更新