あなたのコードが動作しない理由は、FOR DO()句が実際にFOR文を実行する前に、一度に解析されるの全身からです。しかし、%ERRORLEVEL%の値は解析時に展開されるため、実行時に更新された値を見ることはできません。
あなたはそう、あなたのFINDコマンドの出力を見ることに興味がないだけ
ディレクトリにリストを制限するDIR/ADオプションを使用する必要があり、追加の問題
gavendkoaには1つの解決策があります。
もう一つの選択肢は、それが!
が含まれている場合、これは、拡張時と%% dの意志壊れた値でリスクを持っている遅れる拡張
setlocal enableDelayedExpansion
for /f %%d in ('dir /ad /b C:\') do (
find /c "C:\%%d" exclusions.txt >nul
if !errorlevel! equ 1 (
REM Do code here
)
)
を使用することです。これは、ループ内の遅延展開をトグルすることで解決できます。
もう1つの方法は、||
演算子を使用することです。これは、前のコマンドが失敗した場合は次のコマンドを実行することを意味します。
for /f %%d in ('dir /ad /b C:\') do (
find /c "C:\%%d" exclusions.txt >nul || (
REM Do code here
)
)
おそらく最良のオプションは、/ Vと/ GでFINDSTRに直接DIRの結果をパイプで全くエラーレベルを心配する必要性を排除することである:オプションは、あなたの除外に表示される値をフィルタリングしますリスト。
次は
for /f %%d in ('dir /ad /b C:\ ^| findstr /l /v /g:"exclude.list"') do (
REM - Do code here
)
を動作するようになっすぎない - あなたは、異なる長さの複数のリテラル文字列を検索する場合、それが失敗する可能性があります厄介なFINDSTRのバグがあります。
FINDSTRに強制的に正規表現を使用させるようにしていますが、除外リストに表示される正規表現メタ文字をエスケープする必要があります。たとえば、myName.ext
という名前のディレクトリは、myName\.ext
としてエスケープする必要があります。 exclusion.list以内にエスケープする必要があるだろう
for /f %%d in ('dir /ad /b C:\ ^| findstr /r /v /g:"exclude.list"') do (
REM - Do code here
)
その他の文字は\
、^
、$
、[
、]
ある私は忘れる**実際FOR文を実行する前に、一度に解析されます** 。これを思い出してうれしい。 – gavenkoa