2017-06-07 12 views
0

フォルダ内のいくつかのファイルを比較し、見つからないものをテキストファイルに書きたいと思っています。ファイル名と.batを比較し、不足しているエントリを.txtに書き込む

私はフォルダ

C持っている:その中のファイルと

\ \セッションを。これらのファイルは以下のように探しています:

Blabla-1111-FOO 
Blabla-1111-BAR1 
Bleble-2222-FOO 
Bleble-2222-BAR1 
Bleble-2222-BAR2 
Bleble-2222-BAR3 
Bleble-2222-BAR4 
Blublu-5678-FOO 
Blublu-5678-BAR1 
Blublu-5678-BAR2 
Blublu-5678-BAR3 
Blublu-5678-BAR4 
Blublu-5678-BAR5 
Bleble-6666-FOO 
Bloblo-7777-FOO 
Bloblo-8888-FOO 
Bloblo-9999-FOO 

私は一致する-barがnoBARs.txtに存在しない-fooで終わるすべてのファイルを書き留める.BATファイルが必要です。したがって、この場合にはnoBARs.txtは次のようになります。

Bleble-6666-FOO 
Bloblo-7777-FOO 
Bloblo-8888-FOO 
Bloblo-9999-FOO 

1つの-fooファイルに属している複数の-Barファイルが存在する場合があります。 おかげさまでありがとうございました。

答えて

1

次の操作を試みることができる:

@echo off 

setlocal enabledelayedexpansion 
set "source=c:\sessions" 
set "output=noBARs.txt" 
set "find=*foo" 
set "repl=bar*" 

1>"%output%" (
    for %%e in ("%source%\%find%") do (
    set "file=%%e" 
    if not exist "!file:~0,-3!%repl%" (
     echo %%~ne 
    ) 
) 
) 

これは彼らのファイル名内*fooを含むすべてのファイルを反復処理します。次に、ファイル名の最後の3文字をbar*に置き換えて、ファイルの存在をチェックします。対応するbarファイルが存在しない場合は、元のファイル名を出力ファイルnoBARs.txtに書き出します。


私は彼が、数値定数が続きFOOで終わるファイルが同様にテストされるべきであると述べているdEEkAyの最後のコメントに基づいて、スクリプトの代替バージョンを追加しました。私はまだdEEkAyの正確な意図が何であるかはまだ分かりませんが、*FOO*というファイル名は*FOOと同じに扱われると仮定しています。

次の入力:

Blabla-1111-FOO 
Blabla-1111-BAR1 
Bleble-2222-FOO 
Bleble-2222-BAR1 
Bleble-2222-BAR5 
Blublu-3333-FOO6 
Blublu-3333-BAR1 
Blublu-5678-FOO 
Blublu-5678-FOO1 
Blublu-5678-BAR2 
Blublu-5678-BAR4 
Bleble-6666-FOO 
Bloblo-7777-FOO5 
Bloblo-7777-BAR8 
Bloblo-9999-FOO 
Blublu-9999-FOO9 
Bloblo-!^^!-FOO 

は、次のような出力を生成します:

Bleble-6666-FOO 
Bloblo-!^^!-FOO 
Bloblo-9999-FOO 
Blublu-9999-FOO9 

スクリプトの代替バージョンは、オリジナルよりも堅牢です。感嘆符とキャレットが適切に含まれるファイル名とパスを適切に処理できるようになりました。残念ながら、それにはコストがかかります。 forループの反復ごとに実行されるcallコマンドのため、スクリプトはかなり遅くなりました。おそらく、よりバッチファイルのスクリプティング経験を持つ人が、より良い解決策を考え出すことができます。

@echo off 

setlocal disabledelayedexpansion 
set "source=c:\sessions" 
set "output=noBARs.txt" 
set "find=foo" 
set "repl=bar" 

1>"%output%" (
    for %%e in ("%source%\*%find%*") do (
    set "path=%%~dpe" 
    set "file=%%~ne" 

    setlocal enabledelayedexpansion 
    call :ReplaceEndOfString file match "%find%" "%repl%" 

    if not exist "!path!!match!*" (
     echo !file! 
    ) 
    endlocal 
) 
) 
exit /b 

:ReplaceEndOfString (__in *source, __out *dest, __in find, __in repl) { 
    set "temp=!%1:*%~3=%~3!" 
    set "%2=!%1:%temp%=%~4!" 
    exit /b 
} 

"%source%\*%find%?"が唯一のものかもしれない、一つの任意の文字を含む%find%で終わるファイル名に一致するのに対し、"%source%\*%find%*"は、そのファイル名内の%find%を含むすべてのファイルが一致することに注意してください。

+0

ありがとう、私の友人。あなたは私に多くの面倒を救った。あなたのソリューションは完璧に動作します。私はその部分を-3!%match%の隣に置かなければなりませんでした。なぜなら、私の実際の問題では、やや異なる名前になってしまいました。 このバッチを実行するたびに追加する代わりに、出力ファイルを上書きする方法はありますか? – dEEkAy

+0

私のコメントはもう編集できないようです。 del ... txt – dEEkAy

+0

@dEEkAy私はそれに応じてスクリプトを変更しました。実行されるたびに、出力ファイルが上書きされます。また、ソースディレクトリにたくさんのファイルが含まれている場合は、より高速になります。それがあなたの問題を解決するのに役立っていれば、私の投稿を回答としてマークしてください。 – treintje

関連する問題