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

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

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

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

Q&A

解決済

1回答

3688閲覧

バッチ処理でのフォルダ、ファイル作成

Chandler_Bing

総合スコア673

バッチファイル

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

1グッド

0クリップ

投稿2019/08/20 00:30

編集2019/08/21 06:47

バッチファイルの質問

現在のコードは以下です。

CMD

1@echo off 2setlocal enabledelayedexpansion 3 4rem カレントディレクトリにSongsフォルダを作成する 5 6set FILE_PATH=Songs\ 7mkdir Songs 8 9if %errorlevel% == 0 ( 10 11for %%i in (*.txt) do ( 12 set FILE=%%i 13 rem それぞれのテキストファイルを1行ずつ読み込む 14 for /f "delims=" %%a in (%FILE%) do ( 15 set NAME=%%a 16 goto :exit_for 17 ) 18 :exit_for 19 set MAKE_FOLDER=%FILE_PATH%%NAME% 20 echo %NAME% 21 echo %MAKE_FOLDER% 22 if exist "%MAKE_FOLDER%" ( 23 for /f "delims=" %%a in (%FILE%) do ( 24 echo %%a>> %MAKE_FOLDER%\%FILE%_output.txt 25 ) 26 ) else ( 27 mkdir %MAKE_FOLDER% 28 for /f "delims=" %%a in (%FILE%) do ( 29 echo %%a>> %MAKE_FOLDER%\%FILE%_output.txt 30 ) 31 ) 32) 33)

このコードだと、デスクトップに複数のファイルがあるにもかかわらず、1ファイルしか作成されません。
なぜでしょうか。なぜ一番外側のfor文が機能していないのでしょうか。

追記①

bat

1@echo off 2setlocal enabledelayedexpansion 3 4rem カレントディレクトリにSongsフォルダを作成する 5 6set FILE_PATH=Songs\ 7mkdir Songs 8 9if %errorlevel% == 0 ( 10 11 for %%i in (*.txt) do ( 12 set FILE=%%i 13 rem それぞれのテキストファイルを1行ずつ読み込む 14 call :subroutine %FILE% 15 set MAKE_FOLDER=%FILE_PATH%%NAME% 16 if exist "%MAKE_FOLDER%" ( 17 for /f "delims=" %%a in (%FILE%) do ( 18 echo %%a>> %MAKE_FOLDER%\%FILE%_output.txt 19 ) 20 ) else ( 21 mkdir %MAKE_FOLDER% 22 for /f "delims=" %%a in (%FILE%) do ( 23 echo %%a>> %MAKE_FOLDER%\%FILE%_output.txt 24 ) 25 ) 26 ) 27) 28 29:subroutine 30for /f "delims=" %%a in (%1) do ( 31 set NAME=%%a 32 goto :exit_for 33) 34:exit_for 35exit /b

追記②

bat

1@echo off 2setlocal enabledelayedexpansion 3 4rem カレントディレクトリにSongsフォルダを作成する 5 6set FILE_PATH=Songs\ 7mkdir Songs 8 9if %errorlevel% == 0 ( 10 11 for %%i in (*.txt) do call subroutine1 %%i 12 13 rem それぞれのテキストファイルを1行ずつ読み込む 14 for /f "delims=" %%a in (%FILE%) do call:subroutine2 %%a 15 set MAKE_FOLDER=%FILE_PATH%%NAME% 16 if exist "%MAKE_FOLDER%" ( 17 for /f "delims=" %%a in (%FILE%) do call:subroutine3 %%a 18 ) else ( 19 mkdir %MAKE_FOLDER% 20 for /f "delims=" %%a in (%FILE%) do call:subroutine3 %%a 21 ) 22) 23 24:subroutine1 25set FILE=%1 26 27:subroutine2 28set NAME=%1 29goto :exit_for 30:exit_for 31exit /b 32 33:subroutine3 34%1>> %MAKE_FOLDER%\%FILE%_output.txt

追記③

bat

1@echo off 2setlocal enabledelayedexpansion 3 4rem カレントディレクトリにSongsフォルダを作成する 5 6set FILE_PATH=Songs\ 7mkdir Songs 8 9if %errorlevel% == 0 ( 10 11for %%i in (*.txt) do call: function1 %%i 12 13 set MAKE_FOLDER=%FILE_PATH%%NAME% 14 15 if exist "%MAKE_FOLDER%" ( 16 call: function3 %%i 17 ) else ( 18 mkdir %MAKE_FOLDER% 19 call: function3 %%i 20 ) 21) 22 23:function1 24set FILE=%1 25call:function2 %FILE% 26 27:function2 28for /f "delims=" %%a in (%1) do ( 29set NAME=%%a 30goto :exit_for 31) 32:exit_for 33exit /b 34 35:function3 36for /f "delims=" %%a in (%1) do ( 37echo %%a>> %MAKE_FOLDER%\%1_output.txt 38exit /b 39

追記④

bat

1 2@echo off 3for %%i in (*.txt) do call :sub %%i 4echo %FILE% 5exit /b 6 7:function1 8set FILE=%1 9exit /b 10

追記④に対するCMDの表示結果

The system cannot find the batch label specified - The system cannot find the batch label specified - The system cannot find the batch label specified - The system cannot find the batch label specified - 無題2.txt

現在デスクトップには無題2.txtを含めtxtファイルが6つあります。

追記⑤

bat

1@echo off 2 3rem カレントディレクトリにTempフォルダを作成する 4set FILE_PATH=Temp\ 5mkdir Temp 6if not %errorlevel% == 0 exit /b 7 8for %%i in (*.txt) do call :sub %%i 9exit /b 10 11:sub 12 set FILE=%1 13 rem それぞれのテキストファイルを1行ずつ読み込む 14 set /p NAME=<%FILE% 15 set MAKE_FOLDER=%FILE_PATH%%NAME% 16 if not exist "%MAKE_FOLDER%" mkdir "%MAKE_FOLDER%" 17 type "%FILE%" >> %MAKE_FOLDER%\%FILE%_output.txt 18exit /b
bochan2👍を押しています

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

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

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

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

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

Zuishin

2019/08/20 00:38

一番外側だけ残してその中に適当なコマンドを入れたらわかると思います。
guest

回答1

0

ベストアンサー

先の質問に書いたとおりですが、

forにはいろいろ制約があるので、そのあたりを熟知していない限り、

CMD

1for ~~~ do ( 2 ====== 3) 4・・・・・

は、全部、

CMD

1for ~~~ do call :subr1 2・・・・・ 3exit /b 4 5:subr1 6====== 7exit/b

に書き直した方が良いです。

・括弧内で環境変数にセットしても参照するとforに入る前の値になる
gotoするとforから抜ける

追記:
ループが1回で終わるのはgotoしているからです。
サンプル:

CMD

1@echo off 2for %%A in (aa bb cc) do ( 3 echo 1: %%A 4 goto XX 5:XX 6 echo 2: %%A 7)

gotoした時点で、forループの中であるという情報が無くなるようです。

#追記
こんな感じで。

CMD

1@echo off 2rem カレントディレクトリにSongsフォルダを作成する 3 4set FILE_PATH=Songs\ 5mkdir Songs 6 7if not %errorlevel% == 0 exit /b 8 9for %%i in (*.txt) do call :sub %%i 10exit /b 11 12:sub 13 set FILE=%1 14 rem それぞれのテキストファイルを1行ずつ読み込む 15 for /f "delims=" %%a in (%FILE%) do ( 16 set NAME=%%a 17 goto :exit_for 18 ) 19:exit_for 20 set MAKE_FOLDER=%FILE_PATH%%NAME% 21 echo %NAME% 22 echo %MAKE_FOLDER% 23 if exist "%MAKE_FOLDER%" ( 24 for /f "delims=" %%a in (%FILE%) do ( 25 echo %%a>> %MAKE_FOLDER%\%FILE%_output.txt 26 ) 27 ) else ( 28 mkdir %MAKE_FOLDER% 29 for /f "delims=" %%a in (%FILE%) do ( 30 echo %%a>> %MAKE_FOLDER%\%FILE%_output.txt 31 ) 32 ) 33exit /b

もう少しコンパクトに書くと、

CMD

1@echo off 2rem カレントディレクトリにSongsフォルダを作成する 3set FILE_PATH=Songs\ 4mkdir Songs 5if not %errorlevel% == 0 exit /b 6 7for %%i in (*.txt) do call :sub %%i 8exit /b 9 10:sub 11 set FILE=%1 12 rem それぞれのテキストファイルを1行ずつ読み込む 13 set /p NAME=<%FILE% 14 set MAKE_FOLDER=%FILE_PATH%%NAME% 15 echo %NAME% 16 echo %MAKE_FOLDER% 17 if not exist %MAKE_FOLDER% mkdir %MAKE_FOLDER% 18 type %FILE% >> %MAKE_FOLDER%\%FILE%_output.txt 19exit /b

投稿2019/08/20 00:55

編集2019/08/20 05:30
otn

総合スコア84538

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

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

Chandler_Bing

2019/08/20 00:58

なるほどありがとうございます。 もう少しリサーチして返信します。
Chandler_Bing

2019/08/20 01:22

追記①のようにコードを変換しました。 結果は同じでした。 サブルーチンでgoto:をして同じなのでしょうか。
otn

2019/08/20 03:02

繰り返しになりますが、 for ~~ do ( ~~ ) を全部 for ~~ do call xxxx に書き直してください。
Chandler_Bing

2019/08/20 03:59

了解しました。 今から書き直します。すみません。
Chandler_Bing

2019/08/20 04:16

書きな押したのですが、インターナルエラーがでます。 サブルーチンの中でサブルーチンを呼ぶべきでしょうか。
otn

2019/08/20 04:18

> サブルーチンの中でサブルーチンを呼ぶべきでしょうか。 はい。そうですね。
Chandler_Bing

2019/08/20 04:32

ありがとうございます。 書き直しました。 しかしlabelが見つかりませんとなります。 どうかご教授お願い致します。
Chandler_Bing

2019/08/20 05:21

ありがとうございます。ご提示いただい追記のコードはエラーがでます。 私の最初のコードのほうが結果だけ見ると完成形に近い感じです。 otnotn様に最初に頂いたご指摘に戻るため 追記④を実行しました。 またご教授頂けると嬉しいです。
otn

2019/08/20 05:31

>追記のコードはエラーがでます。 途中で方針変更したときの修正ミスでした。
Chandler_Bing

2019/08/20 05:34

長くありがとうございます。 出来れば追記④の質問にも答えていただければ嬉しいです。
Chandler_Bing

2019/08/20 05:36

また追記して頂いた2つ目のコードですが set /p NAME=<%FILE% で一行目だけが抽出できるのでしょうか。
otn

2019/08/20 05:39

はい。set /p は1行入力するコマンドです。 追記4の質問とは?
Chandler_Bing

2019/08/20 06:00

回答ありがとうございます。 質問を編集し、追記④を追加しました。 なぜこのような現象になるのか教えていただきたいです。
Chandler_Bing

2019/08/20 07:15

長々申し訳ないですが、どうか返信お願いします。
otn

2019/08/20 08:30

「何をしたらこうなる」という風に書いてください。意味がわかりません。
Chandler_Bing

2019/08/20 23:34

追記④を実行すると追記④の下に貼った表示結果になります。 デスクトップにあるtxtファイルがすべて表示されると思っていましたが、 The system cannot find the batch label specified - The system cannot find the batch label specified - The system cannot find the batch label specified - The system cannot find the batch label specified - 無題2.txt のような結果になります。 現在デスクトップにはファイルが6つあるので数自体はあっていますが、 なぜ無題2.txt以外はファイル名が表示されないのでしょうか。
Chandler_Bing

2019/08/21 03:56

回答お待ちしております。
otn

2019/08/21 05:11

subというラベルがないので、callが全部エラーになって、そのあとのechoが1回だけ実行され、たまたまFILEに入っていた値が表示されている。 ・ラベルを修正する。 ・echoをサブルーチン内部で行う。 の2点を修正してください。
Chandler_Bing

2019/08/21 05:39

上手くいきました。 ありがとうございます。 しかしい依然として、追記で頂いたコードが機能しておりません。 下のコードが一番完成形に近い形で出力されるのですが、 歌手名がフォルダで作成されるはずですが、 仮に txt1には歌手名ABC txt2には歌手名DEF の場合、 ABCというフォルダは作成されるのですが、 DEFに関しては拡張子なしのファイルが出来てしまいます。 なぜでしょうか。
otn

2019/08/21 05:46 編集

パス名に空白が入っているとか? その場合は何らかのエラーメッセージが出ていると思いますが、ディレクトリ名、ファイル名などを全部 " で囲んでください。
Chandler_Bing

2019/08/21 05:56

本当にありがとうございます。 エラーメッセージは出ておりません。 ””で全て囲ってみます。
Chandler_Bing

2019/08/21 06:46

追記5ののように変更しました。 2人以降のファオルダは作成されましたが、 フォルダの中身が空になってしまっています。
otn

2019/08/21 12:34

> ””で全て囲ってみます。 一部しか囲んでませんが??
Chandler_Bing

2019/08/22 05:21

全てカッコで囲った分を実行し成功しました。 長くお付き合いいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問