2010-09-21 18:44:45 +0000 2010-09-21 18:44:45 +0000
34
34

DOSバッチスクリプトで配列を生成する

DOSバッチスクリプトで配列変数を設定する方法を教えてください。処理するファイル名のリストで読み込みたいのですが、どうすればいいでしょうか?本当はできるだけシンプルにしたいのですが、どうすればいいのでしょうか?ありがとうございました。

回答 (12)

48
48
48
2010-09-21 20:58:31 +0000

判明しました。 (twtw, 私は車輪の再発明は嫌いです。) 今、それがここに投稿されたので、うまくいけば他の人も役に立つと思います。

13
13
13
2013-02-18 23:27:03 +0000

はい、バッチで配列を作ることができます。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
7
7
7
2010-09-21 20:48:19 +0000

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%.

は以下の出力を生成します。

4
4
4
2014-08-29 11:53:30 +0000

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]=tomnames[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のステップで表示されます。

0
0
0
2014-05-01 20:03:34 +0000

テキスト内の文字列と文字を置換します。

テキストを 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
)
0
0
0
2010-09-21 18:53:17 +0000

コマンドプロンプトでは本当の意味で配列を実行することはできません(Windows 3.1を使用していない限りDOSではありません)。(http://www.robvanderwoude.com/ntfor.php)

処理するファイルのリストを作成するには、手動で処理するテキストファイルを作成するか、FORループ内でdir /b <mask>コマンドを使用します。

FORで苦労して学んだこと - SINGLE CHARACTER変数をカーソルとして使用する必要があります!

0
0
0
2010-09-21 19:42:14 +0000

あなたがやりたいことは、各ファイル名に入力変数を使用して、%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
0
0
0
2010-09-21 19:07:50 +0000

FORバッチコマンド](https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx?mfr=true)については、マイクロソフトのドキュメントを参照してください。FORを使用して、ディレクトリのセット、ディレクトリ内のファイル、またはディレクトリ内のファイルとそのサブディレクトリのすべてのファイルを繰り返し処理することができます。

デフォルトでは、FORはセットまたはファイルのみを処理します。

FOR %f IN (*.txt) DO ECHO %f

または、再帰的に処理する場合:

FOR /R %f IN (*.txt) DO ECHO %f

または、ディレクトリだけを処理する場合。

FOR /D %d DO ECHO %d

0x1&

0
0
0
2010-09-21 20:04:48 +0000

ファイルの一覧をfilelist.txtに保存すると、FORを取得してファイルの各行を読み込んで処理すると、

FOR /F "delims=|" %i IN (filelist.txt) DO @echo %i

のように、ファイルの各行を印刷することができます(行の最初の「|」までです。独自の区切り文字を指定しないとスペースとタブが使われるので、パスにスペースがない場合を除いて、完全な行を取得するにはファイル内に現れない文字を指定する必要があります)。

0
0
0
2016-08-16 12:37:34 +0000

これは、BATCH / CMDでTIC TAC TOWゲームの配列をテストするために作った小さなデバッグファイルです。

配列への書き込み

  1. ファイルを与えるか、他のものをインポートするように変更します。
  2. 配列に名前を付ける。

配列からの読み込み

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
0
0
0
2010-09-21 20:11:25 +0000

私は開発作業をしていますが、アプリケーションの複雑な性質のため、毎回ビルドをテストしたいときは(よくあることですが)、ビルドバイナリディレクトリからインストールバイナリディレクトリに5つのファイルをコピーしなければなりません。これが面倒です。今のところ、バッチスクリプトにファイル名をハードコーディングしていますが、スクリプトのメンテナンスを簡単にするために配列に入れたいと思っています。

あなたが探しているのはMakefileと、まともなシェル(bashとか、あなたの好みであれば何でもいいですが)を提供するcygwinだと思います。

0
0
0
2014-08-28 20:57:17 +0000

バッチファイルでこんな感じ?フォルダ内のファイルを選択します。<< 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