3

Я пытаюсь сделать пакетный скрипт, который запрашивает пользовательский ввод. Пользовательский ввод должен быть ограничен определенными словами. Если пользователь вводит любые другие слова, кроме, например, (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

Теперь, как я могу перечислить все принятые слова и сделать эти слова единственными принятыми словами для ввода?

Список слов очень длинный, и мне, вероятно, не нужно включать его здесь.

3 ответа3

4

создайте массив и выполните цикл, предоставьте другое "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"
    

Исходный набор


Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
0
@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 задавая errorlevel = 0, если найдено совпадение и ненулевое значение в противном случае.

Третий метод - это просто еще один способ использования findstr (и это было бы моим предпочтением).

Четвертый метод позволяет указывать разные пункты назначения. При правильном вводе строка goto %$goto% будет переходить к соответствующей метке назначения.

Я использовал файл с именем q1036836_2.txt содержащий это для моего тестирования.

eng,dest_for_eng
fr,destination_for_fr
ger,vere_to_go_for_ger

С любым из этих методов я использовал полный синтаксис. Без сомнения, это может быть сокращено, если требуется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .