2017-10-02 9 views
1

ここで何が起こっているのか非常に混乱しています。 docsから見つかったすべてのdocxを作業ディレクトリにコピーする必要があります。何らかの理由でforループ内の%% fが%fとして表示されます。私はエコーをやっただけで、フォルダがうまく印刷されました。同じことが%% rと%rにも起こります。私はこれを間違って書いていますか?ネストループで変数%% fを使用するバッチファイルが失敗する

set filepath=%1 
for /f %%f in ('dir /ad /b %filepath%') do (
if exist "%filepath%\%%f\docs" (
for /r %filepath%\%%f\docs %%r in (*.docx) do (
echo %%f 
copy %%r "%cd%\edited" 
) 
) 
) 

このバージョンでは使用しません

if exist "C:\Documents\WordDocs\Data1\docs" (for /R C:\Documents\WordDocs\%f\docs %r in (*.docx) do ( 
echo Data1 
copy %r "C:\Users\admin\Desktop\Test" 
))) 
+2

が、出力は代わりのData1の%fとして、それを表示します。 %% fの代わりに%fを使用するだけですか? – Eric

+0

if文までは正常に動作します。そのとき、%% fをネストしたforループの内側で使用しようとすると、それは想定されていた値の代わりに%fが出力されます。 – Eric

+0

これは興味深い問題です!これは '% '記号とは関係なく、' FOR/R'コマンドに何らかの制限があるようです。おそらく 'for/r'コマンドは変数ではなくリテラルパラメータのみを許可しますか? –

答えて

1

出力For /R

For /F "Delims=" %%A In ('Dir/B/AD-L "%~1"') Do If Exist "%~1\%%A\docs\" (
    For /F "Delims=" %%B In ('Dir/B/S/A-D-L "%~1\%%A\docs\*.docx"' 
    ) Do Echo=Copy "%%~B" "%CD%\edited") 
Pause 

削除ライン4と3行目のEcho=あなたは、出力のある満足している場合cmdのウィンドウは、宛先パスの編集を覚えています

2

for commandif commandのような)は、他のコマンドより早く解析されます。現時点ではforのような変数参照は認識されていません。%%fだからfor /R%%fのようなfor変数参照を含むルートパスを使用することはできません。オプション文字列for /Fについても同様です。 %%fの代わりにdelayed expanded variableを使用することもできません。

最も簡単なことの後for /Rループとpopdpushd"%filepath%\%%f\docs"を使用すると、for /Rはちょうどpushdによって設定されたデフォルトルート、つまり現在の作業ディレクトリを使用できるようにすることです手元にスクリプトの回避策;前のものはpopdによって復元されます。ここで私が何を意味するかのデモは、次のとおりです。

set "filepath=%~1" 
for /F %%f in ('dir /A:D /B "%filepath%"') do (
    if exist "%filepath%\%%f\docs" (
     pushd "%filepath%\%%f\docs" 
     for /R %%r in ("*.docx") do (
      echo/%%f 
      copy "%%~r" "%cd%\edited" 
     ) 
     popd 
    ) 
) 

代替が、より複雑な方法は、call commandことによってそれを呼び出すようにしてargumentとしてルートパスを渡すために、サブ・ルーチンにfor /Rループを移動することですこのように:

set "filepath=%~1" 
for /F %%f in ('dir /A:D /B "%filepath%"') do (
    if exist "%filepath%\%%f\docs" (
     call :SUB "%filepath%\%%f\docs" 
    ) 
) 
goto :EOF 

:SUB 
for /R "%~1" %%r in ("*.docx") do (
    echo/%%f 
    copy "%%~r" "%cd%\edited" 
) 
goto :EOF 

リファレンスこの記事:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

関連する問題