質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

1回答

1070閲覧

バッチファイルのfor文でファイルを読み込んだ数値を配列化してechoで出力したい

y_daruma

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2024/02/13 21:51

編集2024/02/13 23:22

実現したいこと

下記を実現したいです。
①バッチファイルでファイルを読み込む。
②読み込んだファイルを配列形式の変数に格納する。
③格納した変数を表示、またファイルに書き出したい。

発生している問題・分からないこと

現状のソースコードだと「echo_test_01.log」のように出力される。
「echo_test_01.log」は「echo_test_02.log」と同様にしたいが、記述方法がわからない。

該当のソースコード

setlocal EnableDelayedExpansion rem 配列の数指定用変数 set a_count_01=0 for /f "tokens=1-3 delims=," %%a in (ip_list.ini) do ( rem 配列カウントアップ set /a a_count_01+=1 rem 読込んだ文字列の変数格納 set array_01[!a_count_01!]=%%a set array_02[!a_count_01!]=%%b set array_03[!a_count_01!]=%%c rem for内出力テスト echo array_01[!a_count_01!]=%!%array_01[!a_count_01!]%!% echo array_02[!a_count_01!]=%!%array_02[!a_count_01!]%!% echo array_03[!a_count_01!]=%!%array_03[!a_count_01!]%!% rem for内ログ出力テスト echo array_01[!a_count_01!]=%!%array_01[!a_count_01!]%!%>>echo_test_01.log echo array_02[!a_count_01!]=%!%array_02[!a_count_01!]%!%>>echo_test_01.log echo array_03[!a_count_01!]=%!%array_03[!a_count_01!]%!%>>echo_test_01.log ) rem 開発検証用_ログ出力 echo array_01[1]=%array_01[1]%>>echo_test_02.log echo array_02[1]=%array_02[1]%>>echo_test_02.log echo array_03[1]=%array_03[1]%>>echo_test_02.log echo array_01[2]=%array_01[2]%>>echo_test_02.log echo array_02[2]=%array_02[2]%>>echo_test_02.log echo array_03[2]=%array_03[2]%>>echo_test_02.log echo array_01[3]=%array_01[3]%>>echo_test_02.log echo array_02[3]=%array_02[3]%>>echo_test_02.log echo array_03[3]=%array_03[3]%>>echo_test_02.log echo array_01[4]=%array_01[3]%>>echo_test_02.log echo array_02[4]=%array_02[3]%>>echo_test_02.log echo array_03[4]=%array_03[3]%>>echo_test_02.log

ip_list.ini

1192.168.1.1,host①,装置① 2192.168.1.2,host②,装置② 3192.168.1.3,host③,装置③ 4192.168.1.4,host④,装置④

echo_test_01.log

1array_01[1]=array_01[1] 2array_02[1]=array_02[1] 3array_03[1]=array_03[1] 4array_01[2]=array_01[2] 5array_02[2]=array_02[2] 6array_03[2]=array_03[2] 7array_01[3]=array_01[3] 8array_02[3]=array_02[3] 9array_03[3]=array_03[3] 10array_01[4]=array_01[4] 11array_02[4]=array_02[4] 12array_03[4]=array_03[4]

echo_test_02.log

1array_01[1]=192.168.1.1 2array_02[1]=host① 3array_03[1]=装置① 4array_01[2]=192.168.1.2 5array_02[2]=host② 6array_03[2]=装置② 7array_01[3]=192.168.1.3 8array_02[3]=host③ 9array_03[3]=装置③ 10array_01[4]=192.168.1.4 11array_02[4]=host④ 12array_03[4]=装置④
set /a a_count_01+=1 rem 読込んだ文字列の変数格納 set array_01[!a_count_01!]=192.168.1.1 set array_02[!a_count_01!]=host① set array_03[!a_count_01!]=装置① rem for内出力テスト echo array_01[!a_count_01!]=array_01[!a_count_01!] echo array_02[!a_count_01!]=array_02[!a_count_01!] echo array_03[!a_count_01!]=array_03[!a_count_01!] rem for内ログ出力テスト echo array_01[!a_count_01!]=array_01[!a_count_01!] 1>>echo_test_01.log echo array_02[!a_count_01!]=array_02[!a_count_01!] 1>>echo_test_01.log echo array_03[!a_count_01!]=array_03[!a_count_01!] 1>>echo_test_01.log  :  :  : echo array_01[1]=192.168.1.1 1>>echo_test_02.log echo array_01[2]=host①>>echo_test_02.log echo array_01[3]=装置①>>echo_test_02.log  :  :  :

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

for文内処理を行うために遅延環境変数は設定した。
下記サイトを確認して「%!%」としてみたが想定通りにはならなかった。
https://kbn48.com/technical/707

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

call で展開(expansion)を2回行うとよいかと思います。ただ、変数 array_01 と for ループのトークン変数(a)が重なってしまうので、トークン変数の名前を x に変更します。

batch

1for /f "tokens=1-3 delims=," %%x in (ip_list.ini) do ( 2 3 rem 配列カウントアップ 4 set /a a_count_01+=1 5 6 rem 読込んだ文字列の変数格納 7 set array_01[!a_count_01!]=%%x 8 set array_02[!a_count_01!]=%%y 9 set array_03[!a_count_01!]=%%z 10 11 rem for内出力テスト 12 call echo array_01[!a_count_01!]=%%array_01[!a_count_01!]%% 13 call echo array_02[!a_count_01!]=%%array_02[!a_count_01!]%% 14 call echo array_03[!a_count_01!]=%%array_03[!a_count_01!]%% 15 16 rem for内ログ出力テスト 17 call echo array_01[!a_count_01!]=%%array_01[!a_count_01!]%%>>echo_test_01.log 18 call echo array_02[!a_count_01!]=%%array_02[!a_count_01!]%%>>echo_test_01.log 19 call echo array_03[!a_count_01!]=%%array_03[!a_count_01!]%%>>echo_test_01.log 20 21)

投稿2024/02/14 09:27

melian

総合スコア20574

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_daruma

2024/02/14 12:33

ご回答ありがとうございます!! 実機で確認したところ、想定通りの動きをしました。 ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問