🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

バッチファイル

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

Q&A

解決済

1回答

1326閲覧

Windows バッチ ファイルのコピー処理が動きません

uraringo

総合スコア15

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

バッチファイル

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

0グッド

0クリップ

投稿2019/12/09 09:08

特定の拡張子付きのファイルがあるフォルダの中身を別の場所にコピーする処理が動きません。
2回目のfor文がなぜか実行されません。
3つ目のecho(ORG_COPY_PATH)は値が取れているのはログで確認できました。
2回目のfor文のパスを3つ目のechoでログに出力されたパスで直書きすると動きます。

エラーも出力されない為、手詰まり状態です。。。

bat

1setlocal EnableDelayedExpansion 2for /r %UNZIP_FILE_PATH% %%i in (*.txt) do ( 3 4 echo %%i>>log.txt 5 SET ORG_COPY_PATH=%%~dpi 6 7 findstr "Zone_10" "%%i" >NUL 2>&1 && ( 8 echo 10系です>>log.txt 9 echo !ORG_COPY_PATH!>>log.txt 10 11 for /r "!ORG_COPY_PATH!" %%a in (*.*) do ( 12 echo "%%a">>log.txt 13 copy "%%a" D:\Data 14 ) 15 ) 16) 17endlocal

以上、ご教示よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

forの構文解析より後で、遅延環境変数の展開が行われるため、for /rの開始ディレクトリは、!ORG_COPY_PATH!という文字通りの名前のディレクトリから行われることになります。
で、そんなものは無いので、ループは0回で終わります。

CMD

1mkdir !ZZZ! 2echo > !ZZZ!\sample 3setlocal EnableDelayedExpansion 4set ZZZ=%TEMP% 5for /r !ZZZ! %%A in (*) do echo %%A

というシンプルなケースで確認できます(ディレクトリは後で消しておいてください)。

一般に、複雑なケースでは、括弧による複文を使うのは苦労が多いです。
for ~~~ do call :subproc1 %%Aのように内部サブルーチンに飛ばして、そこで処理するのが楽です。多くの場合は遅延環境変数展開も不要です。

今回は、ちょっとの手直しでできます。また、本題とは関係ないですが、遅延環境展開も不要です。

CMD

1for /r %UNZIP_FILE_PATH% %%i in (*.txt) do ( 2 3 echo %%i>>log.txt 4 5 findstr "Zone_10" "%%i" >NUL 2>&1 && ( 6 echo 10系です>>log.txt 7 echo %%~dpi>>log.txt 8 9 pushd %%~dpi 10 for /r %%a in (*.*) do ( 11 echo "%%a">>log.txt 12 copy "%%a" D:\Data 13 ) 14 popd 15 ) 16)

for /r %%~dpi %%a in (*.*) doという書き方が出来ればいいのですが、これも駄目です。for制御変数の展開も、forの構文解析後に行われます。
ここで使えるのは、普通の環境変数展開と、位置パラメーターだけです。

上に書いたように複雑な括弧を使わない方針で行くと、

CMD

1for /r %UNZIP_FILE_PATH% %%i in (*.txt) do call :TXT %%i 2exit /b 3 4:TXT 5 echo %1>>log.txt 6 7 findstr "Zone_10" "%1" >NUL 2>&1 && call :COPY %1 8 exit /b 9 10:COPY 11 echo 10系です>>log.txt 12 echo %~dp1>>log.txt 13 14 for /r %~dp1 %%a in (*.*) do ( 15 echo "%%a">>log.txt 16 copy "%%a" D:\Data 17 ) 18 exit /b

位置パラメーター%~dp1の展開は、forの構文解析と同時なので大丈夫です。

投稿2019/12/09 17:27

otn

総合スコア85890

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

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

uraringo

2019/12/10 00:29

丁寧なご回答ありがとうございました。 最初は for /r %%~dpi %%a in (*.*) do も試してみたのですが、ダメだったのでわざわざ変数にしてしまいましたが そもそも解析される時に値が分かってないのダメだったのですね。 1.解析 2.遅延時に変数代入してくれるはず 3.実行 と勝手に思い込んでいました。 サブルーチン化し無事実行することができました。 ありがとうございました!
uraringo

2019/12/10 04:57

コメントありがとうございます。 ぜひ参考にさせていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問