DOSバッチスクリプトで配列を生成する
DOSバッチスクリプトで配列変数を設定する方法を教えてください。処理するファイル名のリストで読み込みたいのですが、どうすればいいでしょうか?本当はできるだけシンプルにしたいのですが、どうすればいいのでしょうか?ありがとうございました。
DOSバッチスクリプトで配列変数を設定する方法を教えてください。処理するファイル名のリストで読み込みたいのですが、どうすればいいでしょうか?本当はできるだけシンプルにしたいのですが、どうすればいいのでしょうか?ありがとうございました。
はい、バッチで配列を作ることができます。CやVBの配列のようなものではありませんが、できます。
@echo off
setlocal enabledelayedexpansion
set arrayline[0]=############
set arrayline[1]=#..........#
set arrayline[2]=#..........#
set arrayline[3]=#..........#
set arrayline[4]=#..........#
set arrayline[5]=#..........#
set arrayline[6]=#..........#
set arrayline[7]=#..........#
set arrayline[8]=#..........#
set arrayline[9]=#..........#
set arrayline[10]=#..........#
set arrayline[11]=#..........#
set arrayline[12]=############
::read it using a FOR /L statement
for /l %%n in (0,1,12) do (
echo !arrayline[%%n]!
)
pause
Jakash3さんのブログより Arrays in Batch では、コマンドプロンプトで配列をエミュレートする方法を説明しています。
記事にはarray.batというバッチファイルが含まれていて、配列を扱うための関数のライブラリが含まれています。記事中のテキストを選択して、それをバットファイルの中に貼り付ける必要があります。
例えば、以下のテストスクリプトです。
@echo off
set book[0]=Avatar
set book[1]=The Green Mile
set book[2]=The Count of Monte Cristo
call array.bat add book Babo
call array.bat len book length
echo I have %length% books you can borrow.
echo Pick one:
echo.
echo 0) Avatar
echo 1) The Green Mile
echo 2) The Count of Monte Cristo
echo 3) Babo
echo.
set /p pick=
call array.bat getitem book %pick% title
echo.
echo You picked %title%.
は以下の出力を生成します。
names[!i!] の代わりに names!i! と書くことで names[1] names[2] names[3] の代わりに names1 names2 names3 を使うことができます。変数名を生成して配列を生成します。バッチには配列構造はありません。
@echo off
setlocal enabledelayedexpansion enableextensions
set i=-1
for %%f in (bob, tom, joseph) do (
set /a i=!i!+1
set names[!i!]=%%f
)
set lastindex=!i!
for /L %%f in (0,1,!lastindex!) do (
echo !names[%%f]!
)
出力 -
c:\blah>a
bob
tom
joseph
c:\blah>
いくつかの説明 -
setlocal enabledelayedexpansion enableextensions
に %var% ではなく !var! を付けた set /?
は、変数が FOR や IF の中にあるときに正しく動作するように、おかしな動作を防ぐために必要です。これはバッチファイルでの奇妙な動作です。これについてはnames[0]=bob
を参照してください。
これは配列を生成するもので、配列について知っている人なら誰でも簡単に理解できるでしょう。names[1]=tom
names[2]=joseph
0x6& 0x6& とすることもできますが、配列の美しさの一つは、ループを使って配列を生成できることです。
for %%f in (bob, tom, joseph) do (
set /a i=!i!+1
set names[!i!]=%%f
)
set lastindex=!i!
これは配列を表示します。%%f これをエコーすると、0から配列の最後のインデックスまで、1のステップで表示されます。
テキスト内の文字列と文字を置換します。
テキストを for 本体に展開し、var を var に置き換えて for ループを試行します。 set コマンドを実行して %1 がユーザ入力になるようにテキスト・ファイルをドラッグ・アンド・ドロップします。
@echo off
setlocal EnableDelayedExpansion
set /p a= enter letter to change:
set /p b= letter to change to:
set /p input=<%1
for /f %%c in ("!input:~!") do (
set "code=!input:%a%=%b%!"
echo !code!>myfile.txt
)
コマンドプロンプトでは本当の意味で配列を実行することはできません(Windows 3.1を使用していない限りDOSではありません)。(http://www.robvanderwoude.com/ntfor.php)
処理するファイルのリストを作成するには、手動で処理するテキストファイルを作成するか、FORループ内でdir /b <mask>
コマンドを使用します。
FORで苦労して学んだこと - SINGLE CHARACTER変数をカーソルとして使用する必要があります!
あなたがやりたいことは、各ファイル名に入力変数を使用して、%1 %2 などの変数で拾うことができます。
これらの変数をループで使用することができますが、メイン・パラメータとして %1 を使用する必要があるのは %1 だけで、他の変数を %1 の「位置」に持ってくるために SHIFT を使用して、IF “X%1” == “X”
例:
:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
これは、BATCH / CMDでTIC TAC TOWゲームの配列をテストするために作った小さなデバッグファイルです。
配列への書き込み
配列からの読み込み
1.読み込みたい配列のサイズまたはその一部を指定します。 2. 配列の名前を %%a を名前の中に入れてください 3.
コード。
@echo off
setlocal EnableDelayedExpansion
set ID=0
:: Reader ::
:: It reads the file called input.txt ::
:: and stores it in a new variable that ::
:: for everytime it goes over it it is a ::
:: new ID (Slot in the array). ::
For /F %%A in (input.txt) do (
set /a ID=ID+1
set Input!ID!= %%A
echo !ID! : %%A
)
:: Writer ::
:: this is to read all Slots in the array ::
:: and puts it on the screen. ::
for /L %%a in (1,1,!ID!) do (
echo !Input%%a!
)
pause>nul
バッチファイルでこんな感じ?フォルダ内のファイルを選択します。<< is comment, no code
:selectapk
SETLOCAL ENABLEDELAYEDEXPANSION << DELAYED EXPANSION on for counter in For loop
SET /A MAXITEM=0
Echo.
Echo Found these APK files in "add_apk_here" folder.
Echo.
For %%a in (add_apk_here/*.apk) do (
Set /A MAXITEM+=1
Set MENUITEM!MAXITEM!=%%a << Fill n local env vars, one for each file, called MENUITEM1...n
Echo !MAXITEM!. %%a
)
Echo.
If !MAXITEM!==0 Echo No APK in "add_apk_here" folder & call :delay & Goto start << No apk files then go back
SET /P CHOICE=Select APK to work on:
SET MENUITEM=!MENUITEM%CHOICE%! << Get the stored filename from MENUITEMx
SETLOCAL DISABLEDELAYEDEXPANSION << Very important for next ENDLOCAL that doesn't like the delayedexpansion var
ENDLOCAL & SET apk=%MENUITEM% << put the local MENUITEM var into the global apk var
goto start
:delay
REM %1 like Call :delay 5
SETLOCAL
SET N=%1
If Not Defined N Set N=2
Ping -n %N% -w 1000 127.255.255.255 > nul
ENDLOCAL
Exit /b