良いトリック:除外したいファイルを読み取り専用にします!
DEL /S
読み取り専用ファイルは削除されません。
次のスクリプトは、あなたが望んでいることとまったく同じではありませんが(以下の私のコメントを参照してください)、読み取り専用ファイルを使用して削除を回避する方法を示しています。
@ECHO OFF
:: This example supposes your first parameter is
:: the relative path to the folder to be deleted
:: and the second is the relative path (from the
:: the target folder) of the one to be excluded
:: Notice that this will only work if the folders
:: are in the working drive, if not, you ll
:: have to specify full paths
IF "%1"=="" GOTO ERROR
IF "%2"=="" GOTO ERROR
IF NOT EXIST %1\NUL GOTO ERROR
CD %1
IF NOT EXIST %2\NUL GOTO ERROR
ECHO Starting up the deletion process
ECHO. * Setting attributes
attrib %1\*.mp3 -r -s -h > NUL
attrib %2\*.mp3 +r > NUL
ECHO. * Deleting files
del /s %1\*.mp3
ECHO. * Reseting attributes
attrib %2\*.mp3 -r > NUL
ECHO.
ECHO Operation completed!
ECHO.
GOTO END
:ERROR
ECHO Parameters:
ECHO. Param1 -> target folder
ECHO. Param2 -> folder to be ignored
ECHO.
GOTO END
:END
注: サブフォルダーだけでなく、特定のタイプのすべてのファイルを無視するために、このスクリプトを適応させることができます。
attrib /S *.xxx +r > NUL
実際には、現在のディレクトリとすべてのサブディレクトリのすべての「xxx」ファイルを除外するのに役立ちます(したがって、/S
オプション)。
注: " > NUL
" の部分は、標準出力を画面に表示する代わりに非表示にするためによく使用されるリダイレクトです。これはdeviceであり、すべてのデバイス ( 、、、および)と同様
であるため、(たとえば、さまざまなパスが関与する大きなループで) 頻繁に使用すると危険な場合があります。AUX
COMn
LPTn
NUL
PRN
- デバイスを開くと、1 つのファイル ハンドルが要求されます。ただし、ファイルとは異なり、デバイスは再起動するまで閉じられません。
- 各デバイスはすべてのドライブのすべてのディレクトリに存在するため
NUL
、たとえば へのリダイレクトを使用C:\
し、その後 で再度使用するとC:\TEMP
、別のファイル ハンドルが失われます。