バッチ For ループから特定の結果を除外する必要がある

バッチ For ループから特定の結果を除外する必要がある

FOR ループを使用して、特定のディレクトリ (およびサブディレクトリ) から Java クラスパスにファイルを再帰的にロードするスクリプトがあります。次のようになります。

/rの場合ディレクトリ%%F IN (*.jar) :addcp を呼び出します %%F

残念ながら、結果から特定のサブディレクトリを除外する必要があります (一部の jar ファイルをロードしたくない)。FOR ループ内に IF ステートメントをネストしてみましたが、成功しませんでした。

残念ながらスクリプト言語を変更することは選択肢になく、すべてのサブディレクトリを反復処理するのはメンテナンス上の悪夢です。これを実行する方法を知っている人はいますか?

私は次のようなことを試しました:

/rの場合ディレクトリ%%F IN ( *.jar) DO IF %%F==*文字列*DO call :addcp %%F

しかし、それは機能しませんでした。

答え1

以下は、「Windows NT」サブディレクトリにあるものを除く、「%ProgramFiles%」の下にあるすべての EXE ファイルの絶対パスのリストをダンプするスクリプトです。おそらく、これで目的のものが見つかると思います。

@echo off

for /f "usebackq delims=" %%i in (`dir "%ProgramFiles%\*.exe" /s /a /b`) do call :checkit "%%i" 
goto end

:checkit
echo %1 | find /i "%ProgramFiles%\Windows NT\" >NUL 2>NUL
if errorlevel 1 echo %~1

:end

答え2

find をお勧めします。man find を見てください。find "%ProgramFiles%\" -iname " のような感じ.exe" ! -regex "%ProgramFiles%\folder_to-exclude.$" -exec call :addcp {} \; で望みどおりの動作が実現できるかもしれません。

答え3

%%F はディレクトリ名ではなく .jar ファイルへのパスに解決されるため、== は機能しません。

私は2段階のプロセスを提案します - まず

dir /s /b directory\*.jar > temp.txt

その後

for /F usebackq %%I in (`findstr /V <excluded path> temp.txt`) do call :addcp %%I

findstr の /V パラメータは、渡した文字列と一致しないすべての行を出力します。本当に必要な場合は、除外対象としてワイルドカードや正規表現も使用できます。

関連情報