1

これは私のコードです:

@echo off
Setlocal EnableDelayedExpansion

set log=C:\mylog.log

set ftpFolder=C:\contributor\ftp
set rotterdamFolder=C:\rotterdam

cd /D C:\contributor
echo [FTP Folder: %ftpFolder%] >> %log%
cd /D %ftpFolder%

for /D %%f in (*) do (
cd %%f
for %%i in (*) do (     
    echo [FTP, %%f] Sending %%i >> %log%
    for /f "tokens=1,2" %%a in (C:\input.txt) do (
        if %%a==%%f ( 
            set et=%%b              
            )
        )
    copy %ftpFolder%\%%f\%%i %rotterdamFolder%\%et% >> %log%
)
cd .. >> %log%
)

input.txt ファイルは次のようなものです。

007   87855
008   87823
015   87830

2 つの列がどのように分割されているか (タブまたはスペース) は重要ではありません。私の問題は、%et% 変数が定義されていないことです。どのように可能ですか?宛先フォルダーとして変数「b」を使用する必要があります。エラーはどこですか?

4

1 に答える 1

2

%et%行が解析されるときに展開され、外側の括弧で囲まれた FOR ループ全体が一度に解析されます。したがって、取得する値は、ループに入る前に存在していた値です。

遅延展開を有効にし、!et!代わりに使用することで問題を解決できます。HELP FOR詳細については、コマンド ラインから orをFOR /?入力してください。遅延拡張に関するセクションは、約半分下にあります。

etしかし、変数を使用する必要はまったくありません。内側のループの最初の列がフォルダー名と一致する場合にのみ、ファイルをコピーしたいと思います。COPY コマンドを SET ステートメントに移動して置き換えるだけです。COPY ステートメントの%%b代わりに使用します。%et%

必要ありませんでしたが、CD コマンドの代わりに PUSHD/POPD を使用しました。パスが指定されている場合、CD によるリダイレクトは無意味です。

パスにスペースや特殊文字が含まれている場合は、パスを引用する必要があります。

for /D %%f in (*) do (
  pushd "%%f"
  for %%i in (*) do (     
    echo [FTP, %%f] Sending %%i >> %log%
    for /f "tokens=1,2" %%a in (C:\input.txt) do if "%%a"=="%%f" (
      copy "%ftpFolder%\%%f\%%i" "%rotterdamFolder%\%%b" >> %log%
    )
  )
  popd
)
于 2013-03-10T21:14:13.390 に答える