0

グループごとに圧縮したいフォルダーにDOSファイルがたくさんあります。ファイル名は次のようにコーディングされます。

devXXXXdbt01.log

qasXXXXwb01.log

devYYYap01.log

qasYYYdb02.log

最初の 3 文字は dev または qas のいずれかです 次の3-5文字 ( XXXXまたはYYY ) は、zip ファイル名として使用する動的グループ名です 次の 2 文字 (db、wb、ap) は 3 つのうちの 1 つです: db、wb 、または ap 次のオプションの文字 t は、一時ファイルであることを意味します。場合によっては、ファイル名に文字 t が含まれていない場合があります。最後の 2 桁はシリアル番号です。

最初の 2 つのようなファイルを含む zip ファイルXXXX.zip、最後の 2 つのようなファイルを含む zip ファイルYYY.zipを作成したいと思います。

グループ名をハードコーディングせずに、DOS バッチを自動的に実行するスクリプトを作成するにはどうすればよいですか?

4

1 に答える 1

1
@ECHO OFF
SETLOCAL
SET sourcedir=c:\sourcedir
SET destdir=u:
PUSHD "%sourcedir%"
FOR /f %%i IN ('dir /b /a-d dev*.* qas*.*') DO CALL :zipme %%i
popd
GOTO :EOF

:zipme
SET destzip=%~n1
SET "num="
SET /a num=1%destzip:~-2% 2>nul
IF NOT DEFINED num ECHO(reject %1&GOTO :EOF 
FOR %%g IN (db wb ap) DO (
 IF /i %%g==%destzip:~-4,2% SET destzip=%destzip:~3,-4%&GOTO zipthis
 IF /i %%gt==%destzip:~-5,3% SET destzip=%destzip:~3,-5%&GOTO zipthis
)
ECHO(reject %1
GOTO :EOF
:zipthis
ECHO wzzip -a "%destdir%\%destzip%" %1
GOTO :eof

ソース ディレクトリの例:

abcxxxdb01.log
devxxxdb01.log
devxxxdb02.log
devxxxdbt03.log
devxxxdbt0x.log
devxxxdbtx1.log
devyyyydbt03.log
devzzzzzap03.log
devzzzzzapt99.log
devzzzzzapt999.log
devzzzzzdb03.log
devzzzzzdbt03.log
devzzzzzjq03.log
devzzzzzwb03.log
devzzzzzxy03.log
qasxxxdb01.log
qasxxxdb02.log
qasxxxdbt03.log
qasxxxdbt0x.log
qasxxxdbtx1.log
qasyyyydbt03.log
qaszzzzzap03.log
qaszzzzzapt99.log
qaszzzzzapt999.log
qaszzzzzdb03.log
qaszzzzzdbt03.log
qaszzzzzjq03.log
qaszzzzzwb03.log
qaszzzzzxy03.log
zxzxxxdb01.log

実行結果:

wzzip -a "u:\xxx" devxxxdb01.log
wzzip -a "u:\xxx" devxxxdb02.log
wzzip -a "u:\xxx" devxxxdbt03.log
reject devxxxdbt0x.log
reject devxxxdbtx1.log
wzzip -a "u:\yyyy" devyyyydbt03.log
wzzip -a "u:\zzzzz" devzzzzzap03.log
wzzip -a "u:\zzzzz" devzzzzzapt99.log
reject devzzzzzapt999.log
wzzip -a "u:\zzzzz" devzzzzzdb03.log
wzzip -a "u:\zzzzz" devzzzzzdbt03.log
reject devzzzzzjq03.log
wzzip -a "u:\zzzzz" devzzzzzwb03.log
reject devzzzzzxy03.log
wzzip -a "u:\xxx" qasxxxdb01.log
wzzip -a "u:\xxx" qasxxxdb02.log
wzzip -a "u:\xxx" qasxxxdbt03.log
reject qasxxxdbt0x.log
reject qasxxxdbtx1.log
wzzip -a "u:\yyyy" qasyyyydbt03.log
wzzip -a "u:\zzzzz" qaszzzzzap03.log
wzzip -a "u:\zzzzz" qaszzzzzapt99.log
reject qaszzzzzapt999.log
wzzip -a "u:\zzzzz" qaszzzzzdb03.log
wzzip -a "u:\zzzzz" qaszzzzzdbt03.log
reject qaszzzzzjq03.log
wzzip -a "u:\zzzzz" qaszzzzzwb03.log
reject qaszzzzzxy03.log

基本的に行う必要があるのは、ソースと宛先のディレクトリ名を設定することだけです。

ルーチン:zipmecall、指定されたファイルマスクに一致するソース ディレクトリから各ファイル名を渡します。名前の部分だけを割り当ててdestzip削除numし、100+名前の下 2 文字に割り当てます。結果が数値でない場合、nun割り当てられないままになり (2>nulはエラーを抑制します)、ファイル名は拒否されます (表示はもちろんオプションです)。

次に、3 つのターゲット文字の組み合わせが、最後から 4 番目の文字から 2 文字の文字列と照合tされ、最後から 5 番目の文字から 3 文字が追加されます。一致すると に転送されZIPTHIS、一致するものがない場合は拒否が (オプションで) 報告されます。

そこから、zip プログラムを呼び出すだけです。コマンドラインをECHO編集したところです。WZZIP

于 2013-07-25T00:41:31.307 に答える