批处理命令如何为 set /p 制作列表

批处理命令如何为 set /p 制作列表

我正在尝试编写一个要求用户输入的批处理脚本。用户输入应限于某些单词。如果用户输入除例如(eng、ger、fra)以外的任何其他单词,则用户将收到类似“请输入一种语言”的回显。

我还想将用户输入存储为变量以便在批处理文件中进一步使用。

我目前有的是:

:Get_ISOlanguage
set "ISOlanguage="
set /p ISOlanguage=Enter subtitle language in ISO 639-2 standard abbreviation:
if not defined ISOlanguage echo You must enter a value. Try again.&goto Get_ISOlanguage

现在我如何列出所有可接受的单词并使这些单词成为输入中唯一可接受的单词?

单词列表很长,我可能不需要在这里将其包括在内。

答案1

创建一个数组并循环,如果需要提供不同的“goto”

@echo off
set langList=("language1()","language2","language3")

:Get_ISOlanguage
set "ISOlanguage="
set /p ISOlanguage=Enter subtitle language in ISO 639-2 standard abbreviation:
set ISOlanguage="%ISOlanguage%"

for %%x in %langList% do (
if ""%ISOlanguage%"" == ""%%x"" (echo LANGUAGE SUPPORTED
goto :CONTINUE))
echo LANGUAGE NOT SUPPORTED 
goto :GET_ISOlanguage

:CONTINUE
echo ayy lmao

pause

- - - - - - - - - - 编辑 - - - - - - - - - -

@echo off
set langList1[1]="lang1()"
set langList1[2]="lang2"
set langList1[3]="lang3"

set langList2[1]="language1()"
set langList2[2]="language2"
set langList2[3]="language3"

set index=0

:Get_ISOlanguage
set "ISOlanguage="
set /p ISOlanguage=Enter subtitle language in ISO 639-2 standard abbreviation:
set ISOlanguage="%ISOlanguage%"

for /l %%x in (1,1,3) do (set /a index+=1
setlocal enableDelayedExpansion
if "%ISOlanguage%" == "!langList1[%%x]!" (set language=!langList2[%%x]!
goto :CONTINUE))
set index=0
echo LANGUAGE NOT SUPPORTED 
goto :GET_ISOlanguage

:CONTINUE
echo LANGUAGE SUPPORTED
echo YOU CHOSE %language:"=%
pause

答案2

现在我如何列出所有可接受的单词并使这些单词成为输入中唯一可接受的单词?

从您的问题中无法明确说明您到底想要做什么,但这里有一个小示例可供您作为起点。请参阅下面的注释,了解关于如何改进它的建议。

@echo off
:Get_ISOlanguage
set /p ISOlanguage=Enter subtitle language in ISO 639-2 standard || Set ISOlanguageabbreviation=NothingChosen
If "%ISOlanguage%"=="NothingChosen" goto :Get_ISOlanguage
If /i "%ISOlanguage%"=="UK" goto sub_uk
If /i "%ISOlanguage%"=="FR" goto sub_fr
rem add more options here
If /i ...
rem end of more options
rem if we get here it must be invalid input so try again
goto Get_ISOlanguage


:sub_uk
echo You chose UK
goto:eof

:sub_fr
echo You chose FR

笔记:

  • “%ISOlanguage%”包含用户的选择
  • 上述代码基于源链接中的示例。

  • 为了简化批处理文件,您可以使用另一个文件来包含有效 ISO 名称列表(每行一个)

  • 用于findstr检查有效输入而不是多个if语句

  • 类似于(未经测试):

    find /i "%ISOlanguage%" ISONames.txt
    If %ERRORLEVEL% EQU 0 echo "Valid input"
    

来源


进一步阅读

  • Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
  • - 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。

答案3

@ECHO OFF
SETLOCAL
:Get_ISOlanguage
set "ISOlanguage="
set /p ISOlanguage=Enter subtitle language in ISO 639-2 standard abbreviation:
if not defined ISOlanguage echo You must enter a value. Try again.&goto Get_ISOlanguage

:: First way

SET "validlanguages=eng,fr,ger"

FOR %%a IN (%validlanguages%) DO IF /i "%%a"=="%ISOlanguage%" GOTO valid1
ECHO way1 - invalid language "%ISOlanguage%"
GOTO way2

:valid1
ECHO way1 - Valid language "%ISOlanguage%"


:: Second way - languages in file 'q1036836.txt' - one to a line

:way2
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q1036836.txt"
ECHO %ISOlanguage%|FINDSTR /i /x /g:"%filename1%" >NUL
IF ERRORLEVEL 1 (
 ECHO way2 - invalid language "%ISOlanguage%"
) ELSE (
 ECHO way2 - Valid language "%ISOlanguage%"
)

:: Third way - languages in file 'q1036836.txt' - one to a line


SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q1036836.txt"
FINDSTR /i /x /L /c:"%ISOlanguage%" "%filename1%" >NUL
IF ERRORLEVEL 1 (
 ECHO way3 - invalid language "%ISOlanguage%"
) ELSE (
 ECHO way3 - Valid language "%ISOlanguage%"
)

:: Fourth way - languages/destination in file 'q1036836_2.txt' - one to a line


SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q1036836_2.txt"
FOR /f "usebackqtokens=1*delims=," %%a IN ("%filename1%"
 ) DO IF /i "%%a"=="%ISOlanguage%" SET "$goto=%%b"&GOTO valid4
ECHO way4 - invalid language "%ISOlanguage%"

GOTO :eof

:valid4
ECHO way4 - Valid language "%ISOlanguage%" - GOTO "%$goto%"

GOTO :EOF

您需要更改sourcedir和的设置filename1以适合您的情况。

我使用包含此内容的文件q1036836.txt进行测试。

eng
fr
ger

第一种方法只是迭代列表中的每个项目,找到匹配项后转到有效标签。如果列表已用尽,请重试。

如果发现匹配,则第二种方法和第三种方法利用findstr设置=0,否则设置非零。errorlevel

第三种方法只是另一种使用方法findstr(也是我所偏好的方法)。

第四种方法允许指定不同的目的地。输入有效后,一行goto %$goto%将跳转到相应的目的地标签。

我使用包含此内容的文件q1036836_2.txt进行测试。

eng,dest_for_eng
fr,destination_for_fr
ger,vere_to_go_for_ger

对于任何一种方法,我都使用了完整的语法。毫无疑问,如果需要,它可以被缩写。

相关内容