ユーザー入力を求めるバッチスクリプトを作成しようとしています。ユーザー入力は特定の単語に制限する必要があります。ユーザーが他の単語を入力した場合(例: (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
受け入れられたすべての単語をリストし、これらの単語を入力の唯一の受け入れられた単語にするにはどうすればよいですか?
Wordのリストは非常に長く、おそらくここに含める必要はありません。
配列を作成してループし、必要に応じて別の「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
あなたの質問からあなたが何をしたいのか正確にはわかりませんが、ここにあなたが出発点として使うことができる小さな例があります。改善方法の提案については、以下の注を参照してください。
@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
ノート:
上記のコードは、ソースリンクの例に基づいています。
バッチファイルを単純化するために、有効なISO名のリスト(1行に1つ)を含む別のファイルを作成できます。
複数のfindstr
ステートメントの代わりに、if
を使用して有効な入力を確認してください
次のようなもの(テストされていません):
find /i "%ISOlanguage%" ISONames.txt
If %ERRORLEVEL% EQU 0 echo "Valid input"
ソース セット
@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
最初の方法は、リスト内の各アイテムを単純に繰り返し、一致するものを見つけると、有効なラベルに移動します。リストが使い果たされた場合は、再試行してください。
2番目の方法と3番目の方法は、一致が見つかった場合はfindstr
設定errorlevel
= 0を利用し、それ以外の場合はゼロ以外を利用します。
3番目の方法は、findstr
を使用する別の方法です(私の好みです)。
4番目の方法では、さまざまな宛先を指定できます。有効なエントリでは、行goto %$goto%
が適切な宛先ラベルにジャンプします。
これを含むq1036836_2.txt
という名前のファイルをテストに使用しました。
eng,dest_for_eng
fr,destination_for_fr
ger,vere_to_go_for_ger
これらの方法のいずれかで、私は完全な構文を使用しました。必要に応じて省略できることは間違いありません。