Comando em lote como fazer uma lista para set / p

3

Eu estou tentando fazer um script em lote que pede entrada do usuário. A entrada do usuário deve ser limitada a certas palavras. Se o usuário inserir outras palavras além de (eng, ger, fra) o usuário receberá um eco dizendo algo como "Por favor, entre um idioma".

Eu também quero armazenar a entrada do usuário como uma variável para uso posterior no arquivo em lote.

O que eu tenho até agora é:

: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

Agora, como posso listar todas as palavras aceitas e fazer dessas palavras as únicas palavras aceitas para a entrada?

A lista de palavras é muito longa e eu provavelmente não preciso incluir aqui.

    
por Arete 07.02.2016 / 19:49

3 respostas

4

crie uma matriz e faça um loop, forneça "goto" diferente, se necessário

@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

-------------------- EDITAR --------------------

@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
    
por 07.02.2016 / 20:10
2

Agora, como posso listar todas as palavras aceitas e fazer dessas palavras as únicas palavras aceitas para a entrada?

Não está claro a partir de sua pergunta exatamente o que você quer fazer, mas aqui está um pequeno exemplo que você pode usar como ponto de partida. Veja as notas abaixo para uma sugestão de como você pode melhorá-lo.

@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

Notas:

  • "% ISOlanguage%" contém a opção do usuário
  • O código acima é baseado em um exemplo no link da fonte.

  • Para simplificar o arquivo em lotes, você pode ter outro arquivo contendo uma lista de nomes ISO válidos (um por linha)

  • Use findstr para verificar a entrada válida em vez de várias instruções if

  • Algo como (não testado):

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

Fonte conjunto

Leitura Adicional

  • Um índice A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
  • definir - Exibir, definir ou remover variáveis de ambiente do CMD. As alterações feitas com o SET permanecerão apenas pela duração da sessão atual do CMD.
por 07.02.2016 / 20:09
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

Você precisaria alterar as configurações de sourcedir e filename1 para se adequar às suas circunstâncias.

Eu usei um arquivo chamado q1036836.txt contendo isso para o meu teste.

eng
fr
ger

O primeiro método simplesmente itera sobre cada item em uma lista e ao encontrar uma correspondência vai para o rótulo válido. Se a lista estiver esgotada, tente novamente.

O segundo método e o terceiro método exploram findstr setting errorlevel = 0 se houver uma correspondência encontrada e diferente de zero.

O terceiro método é simplesmente outra maneira de usar findstr (e seria minha preferência).

O quarto método permite que diferentes destinos sejam especificados. Na entrada válida, uma linha goto %$goto% pula para o marcador de destino apropriado.

Eu usei um arquivo chamado q1036836_2.txt contendo isso para o meu teste.

eng,dest_for_eng
fr,destination_for_fr
ger,vere_to_go_for_ger

Com qualquer um desses métodos, usei a sintaxe completa. Sem dúvida, poderia ser abreviado, se necessário.

    
por 08.02.2016 / 05:14