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

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

ただいまの
回答率

91.39%

  • Windows 7

    287questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

  • バッチファイル

    130questions

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

あバッチ処理で二重のfor文を実装したい

解決済

回答 1

投稿 2017/11/21 10:21 ・編集 2017/11/21 12:26

  • 評価
  • クリップ 0
  • VIEW 54

harrier

score 6

バッチ処理にて2重のfor文を使用したコードの実装を行いたいと考えています。
コードの概要は以下の通りです

setlocal enabledelaydexpansion
for /L %%N in (1,1,50) do (
対象のフォルダ50個それぞれにあるファイル数cをそれぞれ取得
for /L %%i in (0,1,%c%) do ( 
前のfor文で指されているフォルダ内のファイル(すべて0からの番号で記載されている)の全てに対して処理を行うコード
)
)

以上の形でプログラムを組んでおります。
ここで、for文の中のfor文で”フォルダ内のファイル全てに処理を行うコード”がi=0のときしか行われず、for文のループを抜け出し、一つ目のfor文の方の作業に戻ってしまい、結果として、対象としたフォルダ内のファイル数をカウントするところまでは出来るのですが、その次のfor文が1度しか回らないという事態になっております。

インターネットで検索を行っても具体的な解決策が見当たらないため、相談させていただきました。解決策をご存知の方いらっしゃいましたらご回答のほどお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

それはWindowsのバッチ処理特有の問題によるものですね。知らないとはまります。バッチ処理では、環境変数の展開が「行または()ブロックを読み取ったときに1回だけ」行われます。ご質問のようにforブロック内で環境変数を設定しても、それを展開する際は「読み取ったときに設定されていた内容」に置き換わります。

例えば、こんな感じのバッチファイルを作ったとして、実行してみれば明らかに意図通りではないことが判ると思います。

@echo off

set HOGE=123
echo A:%HOGE%

set HOGE=456 & echo B:%HOGE%

(
    set HOGE=789
    echo C:%HOGE%
)

for %%A in (100 200 300) do (
    set HOGE=%%A
    echo D:%HOGE%
)

一応回避策は用意されていて、読み取り時ではなく「コマンド実行時」に環境変数を展開する「遅延環境変数」という仕組みがあります。SETLOCAL ENABLEDELAYEDEXPANSION(大文字小文字不問)というコマンドを実行すると遅延環境変数が有効になります。通常はバッチファイルの先頭付近に書きます。そして、環境変数の展開には%ではなく!で囲みます。

上記バッチはこんな感じで書き換えます。これだと意図通りに実行されることが確認できると思います。

@echo off
setlocal enabledelayedexpansion

set HOGE=123
echo A:!HOGE!

set HOGE=456 & echo B:!HOGE!

(
    set HOGE=789
    echo C:!HOGE!
)

for %%A in (100 200 300) do (
    set HOGE=%%A
    echo D:!HOGE!
)

投稿 2017/11/21 12:02

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/21 12:25

    コメントありがとうございます。
    プログラムの方へ記し忘れたのですが、setlocal nabledelaydexpansionコードはすでに導入しています。

    ほかに考えられる間違いとして括弧のつける場合などを検討してみましたが特に間違いは見当たりませんでした。

    キャンセル

  • 2017/11/21 12:33

    試しに

    @echo off
    setlocal enabledelayedexpansion

    for /L %%N in (1,1,50) do (
    echo ああああああああああああ
    for /L %%i in (0,1,30) do (
    echo !i!
    )
    )

    以上のようなプログラムでまわるか実行をしてみたのですが、echo!i!の部分で
    ECHOは<OFF>です。
    と出力がされてしまっているため、enabledelayedexpansionがうまく適用されていない可能性があるのですが、どこかに間違いはありますでしょうか?

    キャンセル

  • 2017/11/21 12:51

    forの変数%%iは環境変数ではないのでそのまま%%iとしてください。

    キャンセル

  • 2017/11/21 13:01

    それと、setlocal enabledelaydexpansionをやっても、%c%のままだと遅延環境変数にはなりません。

    キャンセル

  • 2017/11/21 13:05 編集

    コメントありがとうございます
    %%iとしたことで、試しに行ったプログラムは回りました

    本題のプログラムへ戻りまして、for文の中for文に対してechoをかけて繰り返し処理が行われているのか確認を行ったところ、出力される値は0でとまっており相変わらず動作がされない状態です。
    最初に定義した方のfor文はしっかりと回っています

    キャンセル

  • 2017/11/21 13:11

    また、2個目のfor文では1つ目のfor文で取得した値cを使用していますが、2つ目のfor文でcとした部分を適当な定数()とした場合はきちんと2つ目のfor文も回りましたので、値の受け渡しがうまくいっていないのでしょうか?

    キャンセル

  • 2017/11/21 13:12

    バッチ処理の内容がわからないので判断のしようがありません。問題が再現できるバッチを提示していただけないでしょうか。

    キャンセル

  • 2017/11/21 13:18

    「%c%」を「!c!」に直しましたか?

    キャンセル

  • 2017/11/21 14:16

    コメントありがとうございます
    受け渡し時の「%c%」を「!c!」へと変更したことでうまく動きました
    ありがとうございます!

    キャンセル

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

ただいまの回答率

91.39%

関連した質問

同じタグがついた質問を見る

  • Windows 7

    287questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

  • バッチファイル

    130questions

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