0

以前、このような質問があることは知っていますが、私の場合、「削除」操作で除外するファイルを指定する際に特別な条件があります。

ファイル名の例:

A_001.xml
A_002.xml
B_001.xml
B_002.xml
B_003.xml
C_009.xml
D_002.xml

上記のファイルは1つのディレクトリにあり、すべてのファイルを削除する必要がありますが、ファイル名のカウンターが最も高いA_002.xm、B_003.xml、C_009.xml、およびD_002.xmlの各ファイルのコピーを1つ保持します。

これは可能ですか?私はバッチファイルの作成に慣れていないので、助けてください。ファイルを削除する方法や特定のファイル拡張子を除外する方法はすでに知っていますが、このシナリオで何をすべきかわかりません。

4

2 に答える 2

1
@ECHO OFF

SETLOCAL enabledelayedexpansion
::
:: establish target directory
:: initialise PREFIX to a name that's invalid in a filename
::
SET target=.
SET prefix=:
FOR /f "tokens=1*delims=_" %%i IN (
 'dir /b/a-d/o-n "%target%\*_*.xml'
 ) DO (
IF !prefix!==%%i ECHO DEL "%target%\%%i_%%j"
SET prefix=%%i
)

この解決策は、ターゲット ディレクトリ内の *xml ファイルの名前に「_」が含まれていることに依存しています。バッチ開発ディレクトリのいくつかのダミーファイルでテストした.ため、the current directory

DIR コマンドは、パターンに一致するターゲット ディレクトリ内のファイルのリストを*_*.xml生成し/bます。filename only/a-dno directory names, even if they match/o-nin the reverse order of name_

FOR はこの出力を読み取り、プレフィックスとファイル名%%iの残りの部分を に割り当てます。次に、最後に検出されたプレフィックスが保存されます。次のファイル名に一致するプレフィックスがある場合にのみ実行されます%%jprefix%%iDELDEL

ECHOの前にキーワードを挿入したことに注意してくださいDEL。万一の際の安全装置です。PROPOSEDDEL操作は、EXECUTED ではなく、画面に報告されます。バッチが正しいことを確認したら、 を削除するECHOと、削除操作が続行されます。

注意点:

  • 一部のエディターは、末尾のスペースの削除または保持について非常に無頓着です。通常、これは無害ですがSET 、バッチ内のコマンドの末尾にスペースがあると、混乱が生じる可能性があります。
于 2013-03-14T07:34:12.693 に答える
1
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set newprefix=_
for /F %%a in ('dir /on /b /a-d *.xml') do (
for /F "delims=_" %%i in ("%%a") do (
   IF NOT *%%i*==*!newprefix!* (
   for /F %%q in ('dir /on /b /a-d %%i*.xml') do set lastitem=%%q
   attrib +r !lastitem!  > NUL
   del /s /q %%i*.xml 1>NUL 2>NUL 
   attrib -r !lastitem!  > NUL
   set newprefix=%%i
   )
)
)

xml ファイルのプレフィックスごとに、問題のプレフィックスを持つすべてのファイルを一覧表示して、リストの最後のファイルを取得します。次に、最後のものを読み取り専用としてマークします。読み取り専用を除く、指定されたパターンのすべてを削除します。読み取り専用フラグをリセットし、次のプレフィックスに対してやり直します。

于 2013-03-14T07:43:08.637 に答える