Batch file 如何确保批处理变量必须等于某些值?

Batch file 如何确保批处理变量必须等于某些值?,batch-file,if-statement,Batch File,If Statement,我想在批处理文件中编写if not语句,以确保变量必须等于某些值。比如说,如果我想要一个性别变量,我给用户选择 set /p sex=Sex: 我想确保它们只能输入诸如Male/Female或Male/Female或m/f之类的值,否则它将返回到同一行。您可以这样做: :EnterSex ECHO Valid values are: (M)ale / (F)emale SET /P sex=Sex: REM Validate user entered value. SET Result=nu

我想在批处理文件中编写if not语句,以确保变量必须等于某些值。比如说,如果我想要一个性别变量,我给用户选择

set /p sex=Sex:

我想确保它们只能输入诸如Male/Female或Male/Female或m/f之类的值,否则它将返回到同一行。

您可以这样做:

:EnterSex
ECHO Valid values are: (M)ale / (F)emale
SET /P sex=Sex:

REM Validate user entered value.
SET Result=null
FOR /F "usebackq tokens=* delims=" %%A IN (`ECHO ~M~Male~F~Female~ ^| FINDSTR /I ~%sex%~`) DO SET Result=%%A
IF "%Result%" == "null" (
    ECHO The value entered is not valid.
    GOTO EnterSex
)

REM If we get here the value entered was valid.
因此,在上面的例子中,有效值被包装在一个定界符中(
~
,在本例中),然后将所有可能的结果通过管道传输到一个不区分大小写的匹配项中(
FINDSTR
命令),该匹配项用定界符包装用户输入

如果找到匹配项,它将被设置为
%Result%
变量,否则该值将保持
null
单向:

@echo off
setlocal

:SEXY
set /p sex=Sex:

for %%a in (MALE,FEMALE,F,M) DO (
    if /I %sex% EQU %%a (
        set "selected_sex=%%a"
        GOTO OK:
    )
)
GOTO SEXY:
:OK
    echo you are: %selected_sex%

使用扩展搜索和替换(不区分大小写)查看输入的值是否包含在有效值列表中。请在有效列表的开头和结尾注明所需的空格

@echo off
setlocal enableDelayedExpansion
set "validSex= m f male female "
:getSex
set "sex="
set /p "sex=Sex: "
if "!validSex: %sex% =!" equ "!validSex!" goto :getSex

那么,我如何将他们输入的内容重置为
null
?看起来代码的工作方式是,它只回显输入的无效值。如何重置输入的值并将其发送回重新输入(返回集合/p)这是一个非常聪明的想法。