如果没有定义,则循环通过set / p变量

时间:2018-01-30 18:37:18

标签: batch-file

我需要一些帮助,如何通过set / p循环未设置或未输入的变量。我的下面的代码是部分工作的,除非所有的set / 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

2 个答案:

答案 0 :(得分:1)

在第二部分中,您不需要设置已经设置的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

答案 1 :(得分:0)

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。这样做的目的是显示输入的每个值,并提示输入 not 的任何值。当用户响应时,代码然后重新执行cls并显示条目,停止任何空值。请注意,&可用于连接一系列命令。

BTW - !var!中不需要echo因为您没有更改代码块中变量的值。

此外,

if "%pick%" EQU "1" goto getch

将提供一些防止意外用户输入的保护。