回答:
私はそれを考え出した:
set FILE_LIST=(file1.dll file2.exe file3.dll file4.dll file5.dll)
set BIN_PATH="C:\Program Files\My App Folder\bin"
set BAK_PATH="C:\Program Files\My App Folder\bin\Backups"
set DEV_PATH="C:\My Dev Path\bin\Debug"
for %%i in %FILE_LIST% do copy %BIN_PATH%\%%i %BAK_PATH%
for %%i in %FILE_LIST% do copy %DEV_PATH%\%%i %BIN_PATH%
数年前に私はこのようなことをしたので、それを理解するのに少し時間がかかりました。(ところで、私は車輪の再発明が嫌いです。)ここに掲載されたので、うまくいけば他の人もそれを役に立つと思うでしょう。
()
構文を使用して配列をサポートするかどうかを確認するのに便利なMS-DOSインストールがありません。
FILE_LIST[0]
。
はい、配列をバッチで実行できます。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のブログから、バッチの配列では、コマンドプロンプトで配列をエミュレートする方法について説明しています。
この記事にはarray.batという名前のバッチファイルが含まれており、配列の処理に使用される関数のライブラリが含まれています。記事内のテキストを選択して、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 [1] names [2] names [3]ではなく、names1 names2 names3を使用できます。名前の代わりに[!i!]。変数名を生成して配列を生成します。バッチには配列構造はありません。しかし、それは配列構造と同じようにすてきであり、適切な言語(実際には配列構造を持っています!)
@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%ではなく、変数がFORまたはIF内で適切に動作するようにする必要があります。バッチファイルでは奇妙です。set /?
さらに言及されている箇所を参照してください。
これが配列にデータを入力するものであり、配列を知っている人なら誰でも簡単に理解できます。names[0]=bob
names[1]=tom
names[2]=joseph
配列の美しさの1つは、配列をループで埋めることができることでもありますが、これはここで行ったことです。
for %%f in (bob, tom, joseph) do (
set /a i=!i!+1
set names[!i!]=%%f
)
set lastindex=!i!
これにより、アレイが表示されます。%% fをエコーすると、1のステップで0から配列の最後のインデックスに移動します。したがって、names [0] names [1] names [2]を出力します。
for /L %%f in (0,1,!lastindex!) do (
echo !names[%%f]!
)
ファイルのリストをfilelist.txtに保存するFOR
と、次のようにファイルの各行を読み取って処理できます。
FOR /F "delims=|" %i IN (filelist.txt) DO @echo %i
ファイルの各行を印刷するには(行の最初の「|」まで。独自の区切り文字を指定しない場合、スペースとタブが使用されるため、パスにスペースがない場合を除き、文字を指定する必要があります。完全な行を取得するためにファイルに表示されません)。
テキスト内の文字列と文字を置き換えます。
テキストを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
)
バッチファイルにこのようなものがありますか?フォルダー内のファイルを選択します。<<はコメント、コードなし
: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
本当にできないコマンドプロンプトで配列を実行する(また、Windows 3.1を実行していない限り、実際にはDOSでもありません)。ただし、FORコマンドを使用してセットベースの処理を実行できます。
処理するファイルのリストを作成するには、処理するテキストファイルを手動で作成するか、 dir /b <mask>
、FORループ内でコマンドをます。
FORで苦労して学んだこと- カーソルとしてSINGLE CHARACTER変数を使用する必要があります!
FORバッチコマンドに関するMicrosoftのドキュメントを参照してください。FORを使用して、一連のディレクトリ、ディレクトリ内のファイル、またはディレクトリとそのすべてのサブディレクトリ内のファイルを反復処理できます。
デフォルトでは、FORはセットまたはファイルのみを処理します。
FOR %f IN (*.txt) DO ECHO %f
または、再帰的に:
FOR /R %f IN (*.txt) DO ECHO %f
または、ディレクトリだけの場合:
FOR /D %d DO ECHO %d
これは、BATCH / CMDでのtic tac towゲームのte配列をテストするためにしばらく作成した小さなデバッグファイルです。コード上で大きく複雑になることなく、配列の読み取りと書き込みを行うことができます。
使い方は簡単です:
配列への書き込み
配列からの読み取り
コード:
@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