あなたは実際にすべてを正しくしましたが、詳細が欠けています。これが機能するスクリプトです。スペースを含むパスにいくつかのバグがあり、テストされていない可能性があります):
@echo off
SETLOCAL
SET fileList=%1
SET notFoundFile=%2
REM clear the not found file
type NUL > %notFoundFile%
FOR /R %%d IN (.) DO (
FOR /F "tokens=*" %%a IN (%fileList%) DO (
ECHO processing "%%~fd\%%a"
IF NOT EXIST "%%~fd\%%a" ECHO %%~fd\%%a Not found >> %notFoundFile%
)
)
使用法
このコマンドは、現在のディレクトリからファイルを再帰的に検索します。2つのパラメータを受け入れます。1つは検索するファイルのリストを含むファイルへのフルパスで、もう1つは見つからないファイルが記録されているファイルへのフルパスです。
たとえば、次のように想定します。
- 上記のバッチは、ディレクトリc:\ batchdirのファイルfindmissing.cmdに保存されます(つまり、バッチファイルのフルパスはc:\ batchdir \ findmissing.cmdです)。
- 検索するファイルのリストは、次のファイルにリストされています:c:\ batchdir \ listimagescopy.txt
- 「見つかりません」ファイルのリストを含む結果ファイルは次のようになります:c:\ batchdir \ notfound.txt
次に、ディレクトリc:\ searchdirとそのすべてのサブディレクトリ内のファイルを検索するには、そのディレクトリにCDを挿入して、次のコマンドを実行する必要があります。
c:\searchdir> \batchdir\findmissing.cmd \batchdir\listimagescopy.txt \batchdir\notfound.txt
どうしたの
バッチファイルは、最初のパラメーター(例では\ batchdir \ listimagescopy.txt)を引数変数%1に格納し、2番目のパラメーター(例では\ batchdir \ notfound.txt)は%2に格納されます(存在する場合はさらにパラメーターが保存される%3%4など)
SET fileList=%1
SET notFoundFile=%2
コマンドラインパラメータをローカル(上記のSETLOCALのため)環境変数に格納します。これは、より良い変数名を付けるのに便利です。環境変数は、たとえば%fileList%を使用してバッチで拡張(アクセス)されます。
type NUL > %notFoundFile%
「見つかりません」ファイルの内容をクリアするか、存在しない場合は新しい長さゼロのファイルを作成します。このファイルに追加し、さまざまな実行の結果がそこに表示されないようにするため、これは重要です。
FOR /R %%d IN (.) DO (
現在のディレクトリから開始し、(。)と照合してすべてのディレクトリを再帰的に一覧表示します。ディレクトリ名はforループ変数%%dに配置されます
FOR /F "tokens=*" %%a IN (%fileList%) DO (
質問で説明したことを実行します。fileListの各行を取得し、for変数%%aに格納します。
これで、興味深い部分%% dには、末尾の「。」を含むループ内の現在のディレクトリが含まれます。たとえば、次のようになります。
%%d = "c:\searchdir\."
〜fオプションを使用して変数にアクセスすると、末尾の「。」が削除されます。
%%〜fd = "c:\ searchdir"
%% aには、検索しているファイルの1つの名前が含まれています。
%%a = "image001.jpg"
それで:
%%~fd\%%a = "c:\searchdir\image001.jpg"
これらの行は明らかです:
ECHO processing "%%~fd\%%a"
IF NOT EXIST "%%~fd\%%a" ECHO %%~fd\%%a Not found >> %notFoundFile%
とにかく説明します。最初のものは、バッチが何をしているかを示しています。削除して処理を高速化できます(かなり大幅に)。2番目のテストでは、ファイル%%〜fd \ %% aが存在するかどうかをテストし、存在しない場合は、文字列 "%%〜fd \を追加します(>>、>を使用して上書きします)。変数を展開した後、ファイル%notFoundFile%に対して%% a Not found "を実行して、ファイルに見つからないファイルの実際の名前を取得します。
パターンを繰り返す代わりに、%%〜fd \ %% aのコンテンツを変数に配置することで、内部ループをより適切にすることができますが、拡張を遅らせる必要があります。こことここを参照してください。