0

バッチ スクリプトで非常に奇妙なエラーが発生しました。Forループが 1 回だけループしているのに、さらに何度も (少なくとも 10 回) ループする必要があります。

Forループが 1 回しかループしない理由と、それを修正する方法を教えてください。

@ECHO off
CLS
SETLOCAL 

SET macroFolder=_PLACE_4DM_FILES_HERE

REM the following for loop only loops once when it should be looping more 
REM because theres over 10 *.4dm files in the folder??
for /r ./%macroFolder% %%i in ("*.4dm") do SET "file=%%i" (
    echo %file%
    REM Note I need to store %%i in a variable so I can edit it later
    REM And placing %%i in a variable within the for loop results in 
    REM the var being empty for some reason. For eg
    SET file=%%i
    ECHO file is %file%
    REM Prints "file is "
)

ECHO.
PAUSE
ENDLOCAL
4

1 に答える 1

5

(少なくとも) 2 つの問題があります。for1つ目は、ステートメントの括弧付きと非括弧付きの形式を混在させているように見えることです:

for /r ./%macroFolder% %%i in ("*.4dm") do SET "file=%%i" (
    blah blah
)

その場合、括弧で囲まれていないビットはループ反復ごとに実行されますが、括弧で囲まれたビットはループ終了後に実行されます。これは次の方法で確認できます。

for /r ./%macroFolder% %%i in ("*.4dm") do echo 1 (
    echo 2
)

これは出力します(私の場合、3つの4dmファイルがあります):

1 (
1 (
1 (
2

2番目の問題は%%、コマンドが実行される前に変数展開が行われ、コマンドが から閉じ括弧forまでの複数行のものであることです。ループ内で設定された展開が必要な変数は、遅延展開で行う必要があります。for)

これから始めます:

@SETLOCAL enableextensions enabledelayedexpansion
@ECHO off
CLS

SET macroFolder=4dmfiles

for /r ./%macroFolder% %%i in ("*.4dm") do (
    SET file=%%i
    ECHO file is !file!
)

ECHO.
PAUSE
ENDLOCAL

すると、次のように表示されます (私の 3 つのファイルの場合):

file is C:\Users\Pax\Documents\4dmfiles\1.4dm
file is C:\Users\Pax\Documents\4dmfiles\2.4dm
file is C:\Users\Pax\Documents\4dmfiles\3.4dm
于 2013-05-23T04:44:28.240 に答える