2017-01-19 4 views
0

私は、作業ディレクトリとサブディレクトリにあるすべてのファイル.txtを再帰的にループし、そのファイルで何かを実行するスクリプトを持っています。今私はexclude.txtファイルにリストされている特定のサブディレクトリ内のすべてのファイルを除外したいと思います:作業ディレクトリからの相対パスを取得する方法は?

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 

for /r %%f in (*.txt) do (
    CALL:processFile %%f %%~df%%~pf 
) 
GOTO:EOF 

:processFile 
    SET file_=%~1 
    SET path_=%~2     <- %%~df%%~pf is the full path :(
    find "!path_!" exclude.txt 
    IF !ERRORLEVEL! EQU 1 (
     REM do something here 
    ) 
    GOTO:EOF 

しかし、%%/~df%%~pfは絶対パスに展開されます。 作業ディレクトリからの相対パスはどのように取得できますか?サブディレクトリのみをexclude.txtに、完全なパスは表示しません。

PS:私はもちろん、exclude.txtからの相対パスを読ん%cd%を追加し、いくつかのexclude.tempに書き込み、その後、この一時ファイルで検索、私はよりよい方法があると思いますができます。

+0

FORコマンド内でGOTOを使用することはできません。 – Squashman

+0

思考プロセスを逆転させます。 FINDSTRを使用して、/ Gオプションを使用します。除外テキストを検索文字列として使用します。 'echo %% F | findstr/G:exclude.txt'です。そのコードの変更に関わらず、FORコマンドコードブロック内でGOTOを使用することはできません。 – Squashman

+0

@Squashman ups not noticeは、スクリプトを1つのファイルでしかテストしていないためです。私はそれを変更しました、今は大丈夫だと願っています – user463035818

答えて

3

これを試してください。ここ

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 

for /r %%F in (*.txt) do (
    echo %%F|findstr /I /G:exclude.txt >nul 2>&1 
    IF NOT "!ERRORLEVEL!"=="0" (
     REM do something here 
    ) 
) 
+0

あなたの忍耐力に感謝します。私はバッチで本当にnoobです。 'echo'の代わりに何か他のものを使うことができますか? findstr – user463035818

+1

@ tobi303の結果を表示したくない場合は、標準出力と標準エラーをnulにリダイレクトするコードが更新されました。 – Squashman

+1

もし 'if not ErrorLevel 1'や' && '演算子を使っていた場合、遅延拡張を避けることができます... – aschipfl

1

xcopyは相対パスを返すことが可能であるという事実に依存する、異なるアプローチです。何もコピーしたくないので、/Lスイッチを使用する必要があります(リストしますがコピーはしません)。

for /F "delims=" %%F in (' 
    xcopy /L /I /S ".\*.txt" "%TEMP%" ^| find ".\" 
') do (
    echo(Relative path to file: "%%~F" 

    rem // This block is only needed in case the leading `.\` disturbs: 
    set "FILE=%%~F" 
    setlocal EnableDelayedExpansion 
    echo(Relative path, no `.\`: "!FILE:*.\=!" 
    endlocal 
) 
関連する問題