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/10 00:29
2019/12/10 02:05
2019/12/10 04:57