11

Windows で、現在のディレクトリ内のすべてのファイルを削除するバッチ ファイルを作成しようとしていますが、4 つのファイル拡張子 (log、sdb、SDK、bat) を除外しています。

Windows で Forfiles コマンドを試しましたが、現在のフォルダー (bat ファイルも含む) のすべてが削除されます。私のコマンドは次のとおりです。

@ECHO OFF
FORFILES /M *.* /C "cmd /c IF NOT @ext=="sdb" (IF NOT @ext=="sbk" (IF NOT @ext=="log" (IF NOT @ext=="bat" DEL @FILE)))" /Q

どうすればそれを機能させることができますか?

4

6 に答える 6

13
  • 内部引用符はエスケープする必要があります\
  • おそらく必要IF /Iな(大文字と小文字を区別しない)オプション
  • @ISDIR を使用してディレクトリを除外する必要があります
  • DEL /Q オプションは最後の引用符の後にありました。最後の引用符の前にある必要がありますが、必要ありません
  • 括弧は必要ありません
  • マスクは「すべてのファイル」であるため、FORFILES /M オプションは必要ありません。

これはうまくいくはずです

@echo off
forfiles /c "cmd /c if @isdir equ FALSE if /i not @ext==\"sdb\" if /i not @ext==\"sbk\" if /i not @ext==\"log\" if /i not @ext==\"bat\" del @file"

しかし、上記は非常に遅く、入力するのは確かに大変です。

以下は、はるかに簡単で高速です。

@echo off
for /f "delims=" %%F in ('dir /b /a-d ^| findstr /vile ".sdb .sbk .log .bat"') do del "%%F"
于 2012-02-24T03:45:17.647 に答える
10

利用可能な場合ROBOCOPY

@ECHO OFF
MKDIR temporary_pit
ROBOCOPY . temporary_pit /XF *.sdb *.sbk *.log *.bat /MOV >NUL
RMDIR /S /Q temporary_pit

つまり、一時的なサブディレクトリを作成し、そこに削除するファイルを移動します(これは、宛先ディレクトリが同じドライブ上にあるため、ファイルの内容ではなくファイル名のみが再配置されるため、高速です)。サブディレクトリを削除します。

于 2012-02-24T12:56:37.950 に答える
5

また、次のようなこともできます。

@echo off
attrib -r -s *.*
attrib +r +s *.sdb
attrib +r +s *.sbk
attrib +r +s *.log
attrib +r +s *.bat
del *.* /S /Q
attrib -r -s *.sdb
attrib -r -s *.sbk
attrib -r -s *.log
attrib -r -s *.bat

-- マリオ

于 2012-02-24T19:19:40.670 に答える
3
@echo off
setlocal EnableDelayedExpansion
set exclude=.log.sdb.sdk.bat.
for %%f in (*.*) do (
   if /I "%exclude%" == "!exclude:%%~Xf.=!" del "%%f"
)
于 2012-02-24T04:02:24.970 に答える
2
forfiles /s /c "cmd /c (if NOT @ext==\"dqy\" del /s /q @path)" /D -14

これは、このスクリプトを取得できるのと同じくらい簡単です。彼らは、マクロ ファイル (.dqy) を保持し、14 日より古いものはすべて再帰的に削除したいと考えていました。

現在のディレクトリで実行されます (テストするときは注意してください)。

于 2016-03-23T04:26:03.033 に答える
-1

ウイルスによって作成された何百ものファイルを削除する方法を探しているときに、このトピックに出くわしました。どの解決策も実際にうまくいかなかったので、コマンドラインからそれを行う方法を見つけました。2 つの拡張子 (メール アーカイブ) を保持するだけで済みました。これはトリックをしました:

for /R %f in (*) do if not %~xf==.ex1 if not %~xf==*.ex2 del "%f"

/R を使用して再帰的に機能させます。すべてのサブフォルダーを調べます。%~xf は拡張子のみを調べます (何らかの理由で拡張子がないと機能しませんでした)。削除コマンドで引用符「%f」を使用して、ウィンドウの長い名前をスペースで覆います (特にフォルダー名)。また、何らかの理由で、== の前後にスペースを追加するとエラーが発生しました。

于 2016-05-13T10:22:21.457 に答える