2

ファイル名のリストを含むテキストファイルがあり、「存在しない場合」を検索したいのですが、コマンドでlistimagescopy.txtドキュメントに記載されているファイルが見つからない場合は、新しいドキュメントnotfound.txtを作成する必要があります。すべてのファイルが見つかりません

私はそれを理解しようとし始めましたが、私はあまり良くありませんwcmd-この影響への何か-.cmdファイルに貼り付けられました

@echo off

FOR /F "tokens=*" %%a IN (listimagescopy.txt) DO (
 IF NOT EXIST "%%a" echo %%a Not found >notfound.txt
)

検索するフォルダを指定する方法と場所がわからない-サブフォルダを検索する必要があるかもしれませんネストされたFORを使用する必要があるかもしれませんwFOR/ R...imわからない

(同様の質問を見つけましたが、どの回答も必要なことを実行しません-ファイルのリストが存在するかどうかをテストするにはどうすればよいですか?

4

2 に答える 2

1

あなたは実際にすべてを正しくしましたが、詳細が欠けています。これが機能するスクリプトです。スペースを含むパスにいくつかのバグがあり、テストされていない可能性があります):

@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つは見つからないファイルが記録されているファイルへのフルパスです。

たとえば、次のように想定します。

  1. 上記のバッチは、ディレクトリc:\ batchdirのファイルfindmissing.cmdに保存されます(つまり、バッチファイルのフルパスはc:\ batchdir \ findmissing.cmdです)。
  2. 検索するファイルのリストは、次のファイルにリストされています:c:\ batchdir \ listimagescopy.txt
  3. 「見つかりません」ファイルのリストを含む結果ファイルは次のようになります: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のコンテンツを変数に配置することで、内部ループをより適切にすることができますが、拡張を遅らせる必要があります。ここここを参照してください。

于 2013-01-08T23:46:58.033 に答える
0

これにより、サブフォルダーにないリスト内のすべてのファイルがファイルに出力されます。notfound.txt

setlocal enabledelayedexpansion
pushd "N:\opasdata\d110001\medias\images"
set found=false
for /f "tokens=* delims=" %%a in (listimagescopy.txt) do (
for /r %%x in (%%a) do (
if exist "%%a" set found=true
)
if "!found!"=="false" echo %%a >>"V:\Current Library\notfound.txt"
set found=false
)
于 2013-01-09T09:40:54.370 に答える