Ok。誤解のないように、できるだけわかりやすく説明します...
Windows バッチ ファイルでは、変数名は文字で始まる必要があり、任意の有効な文字を含めることができます。有効な文字は次のとおりです: #$'()*+,-.?@[]_`{}~ 文字と数字。
これは、cmd.exe の観点からは、SET NORMAL_NAME=123
とまったく同じであり、また;SET A#$'()*+,-.?@[\]_{}~=123
とも同じであることを意味します。SET VECTOR[1]=123
3 つすべてが通常の変数です。このように、配列要素の形式で変数名を記述するのはあなた次第です。
set elem[1]=First element
set elem[2]=Second one
set elem[3]=The third one
このように、echo %elem[2]%
表示されSecond one
ます。
別の変数をインデックスとして使用する場合は、パーセント記号で囲まれた変数をその値で置き換えると、左から右に解析されることを知っておく必要があります。この意味は:
set i=2
echo %elem[%i%]%
は、変数の値を表示し、その後に を表示し、elem[
その後に変数の値を表示することを意味するため、目的の結果が得られません。i
]
この問題を解決するには、 Delayed Expansionを使用する必要があります。つまり、コマンドを先頭に挿入setlocal EnableDelayedExpansion
し、インデックス変数をパーセント記号で囲み、配列要素を感嘆符で囲みます。
setlocal EnableDelayedExpansion
set elem[1]=First element
set elem[2]=Second one
set elem[3]=The third one
set i=2
echo !elem[%i%]!
FOR コマンドのパラメーターをインデックスとして使用することもできますfor /L %%i in (1,1,3) do echo !elem[%%i]!
。!index! を使用する必要があります。FOR または IF: 内でインデックスが変更されたときに、配列要素に値を格納しますset elem[!index!]=New value
。FOR/IF 内でインデックスが変更されたときに要素の値を取得するには、要素を 2 つのパーセント記号で囲み、コマンドの前にcall
. たとえば、配列要素の範囲を左に 4 桁移動するには、次のようにします。
for /L %%i in (%start%,1,%end%) do (
set /A j=%%i + 4
call set elem[%%i]=%%elem[!j!]%%
)
前のプロセスを実現する別の方法は、追加の FOR コマンドを使用して、インデックスの遅延展開を同等の置換可能なパラメーターで変更し、配列要素に遅延展開を使用することです。このメソッドは、以前の CALL よりも高速に実行されます。
for /L %%i in (%start%,1,%end%) do (
set /A j=%%i + 4
for %%j in (!j!) do set elem[%%i]=!elem[%%j]!
)
このように、バッチ ファイルは配列を管理するように動作します。ここで重要なのは、Batch が配列を管理するかどうかではなく、他のプログラミング言語と同じように Batch ファイルで配列を管理できるということです。
@echo off
setlocal EnableDelayedExpansion
rem Create vector with names of days
set i=0
for %%d in (Sunday Monday Tuesday Wednesday Thrusday Friday Saturday) do (
set /A i=i+1
set day[!i!]=%%d
)
rem Get current date and calculate DayOfWeek
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
set /A mm=10%%a %% 100, dd=10%%b %% 100, yy=%%c
)
if %mm% lss 3 set /A mm=mm+12, yy=yy-1
set /A a=yy/100, b=a/4, c=2-a+b, e=36525*(yy+4716)/100, f=306*(mm+1)/10, jdn=c+dd+e+f-1523, dow=jdn %% 7 + 1
echo Today is !day[%dow%]!, %date%
インデックス値は数値に限定されませんが、有効な文字を含む任意の文字列であることに注意してください。この点により、他のプログラミング言語で連想配列と呼ばれるものを定義できます。この回答には、連想配列を使用して問題を解決するために使用される方法の詳細な説明があります。また、スペースは変数名に有効な文字であるため、変数名にスペースを挿入しないように注意する必要があります。
この投稿で、バッチ ファイルで配列表記を使用する必要がある理由について詳しく説明しました。
この投稿には、テキスト ファイルを読み取り、行のインデックスをベクターに格納し、行の内容に基づいてベクター要素のビューブル ソートを実行するバッチ ファイルがあります。同等の結果は、ファイルの内容の並べ替えです。
この投稿では、ファイルに格納されたインデックスに基づく Batch の基本的なリレーショナル データベース アプリケーションがあります。
この投稿では、サブディレクトリから取得した大きなデータ構造を組み立てて、TREE コマンドの形式で表示する、完全な複数連結リスト アプリケーションを Batch で作成しています。