ワイルドカードフォルダからファイルを削除するバッチファイル

ワイルドカードフォルダからファイルを削除するバッチファイル

複数のディレクトリからファイルを削除するバッチ ファイルを作成するにはどうすればよいですか?

D:\L1\asdasda\L3\*.txt
D:\L1\dfghfghfh\L3\*.txt
D:\L1\tyutyugj\L3\*.txt
D:\L1\ytrtyrty\L3\*.txt

のように:

D:
del "d:\L1\*\L3\*.txt"

barlop によるメモ - 質問者が追加 -

私にはそのようなディレクトリが 100 個ほどあります。フォルダを削除したいのではなく、ファイルだけを削除したいのです。それらすべてに L3 フォルダがあり、それらすべてに同じ拡張子のファイルが含まれています。それらは単なる一時ファイルですが、自動的には削除されません。

答え1

サブフォルダ名にワイルドカードを使用して、異なる名前のサブフォルダを動的に削除するバッチ ファイル

ワイルドカードフォルダからファイルを削除するバッチファイル

以下は、私がこのタイプのタスクを完了するためにいつも使用している簡単でシンプルなバッチ スクリプトの例です。説明されているように、ニーズに合わせて変数フォルダー パスを挿入しました。

サンプルバッチスクリプト

(変数ルート フォルダーとサブフォルダーを一番上に設定すると、FOR /D andループがそれに応じて反復され、ロジックがファイルのコマンドFORを指定して完了すると、ディレクトリをトラバースする残りのマジックを実行します)DEL /Q /F*.txt

@ECHO ON

SET SourceDir=D:\L1
SET SourceSubDir=L3

:: --// note the asterisk wildcard after SourceDir in the first FOR /D loop using X as the variable
:: --// note the X variable appended to the beginning of the second FOR (no /D switch here) loop in the SET part using Y as the variable
FOR /D %%X IN ("%SourceDir%\*") DO FOR %%Y IN ("%%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%%~Y"
GOTO EOF

注記: これをコマンドプロンプトで手動でコピー&ペーストして実行する場合には、 FOR ループでは、すべての部分でパーセント記号の 1 つを削除する必要があるため、バッチ スクリプトではなくコピー アンド ペーストで手動で実行し、上記の例のように実行する場合は、その部分に以下を使用します。

FOR /D %X IN ("%SourceDir%\*") DO FOR %Y IN ("%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%~Y"

さらなる詳細と研究

(入力 FOR /? この詳細を確認するには、Windows コマンド プロンプトで

FOR(スイッチなし)

Runs a specified command for each file in a set of files.

FOR %variable IN (set) DO command [command-parameters]

  %variable  Specifies a single letter replaceable parameter.
  (set)      Specifies a set of one or more files.  Wildcards may be used.
  command    Specifies the command to carry out for each file.
  command-parameters
             Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %%variable instead
of %variable.  Variable names are case sensitive, so %i is different
from %I.

If Command Extensions are enabled, the following additional
forms of the FOR command are supported:

/Dの場合

FOR /D %variable IN (set) DO command [command-parameters]

    If set contains wildcards, then specifies to match against directory
    names instead of file names.

答え2

行 \L1\*\L3\* を解釈します。次のように: 指定されたディレクトリ L1 に対して、サブディレクトリ L3 を持つすべてのサブディレクトリを検索し、その中のすべてのファイルを削除します。

ディレクトリ構造を調べるには、スクリプトを作成する必要があります。バッチ ファイルとして簡単に実行できないため、ディレクトリまたはファイルのリストを取得し、それらに対して繰り返しアクションを実行する方法を持つ Perl または PowerShell を使用する必要がある場合があります。

擬似コード

Get list directories
For each dir 
  Cd into it
  Check if The dir L3 exists
  If it does then del .\L3\*.* 
  Go back up a level
Next dir

これについては検討して、バッチ ファイル コードで実行しましたが、違いを確認するために PowerShell でやり直すことも考えています。

わかった、考えてみました

このバッチ ファイルは、実行元のディレクトリ構造を調べて、「L3」という名前のディレクトリの内容を削除します。

@echo off
for /r %%d in (*) do call :process "%%d"
goto :eof

:process
pushd "%~dp1"
for /f "delims=" %%A in ('cd') do (
     set foldername=%%~nxA
    )
if "%foldername%"=="L3" del/q *.*
popd
goto :eof

もっとシンプルにすることは可能かもしれませんが、現在のディレクトリ名だけを取得するアクションは面倒です(プロセスセクションの for ループ)

ディレクトリがこのように始まる場合

└───L1
    │   1.dat
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    │           c.dat
    │           d.dat
    ├───Bob
    │       6.dat
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    │           a.dat
    │           b.dat
    └───Ted
            6.dat

cleantreeを実行すると次のようになるはずです

└───L1
    │   1.dat
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    ├───Bob
    │       6.dat
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    └───Ted
            6.dat

答え3

for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt

for /fセット内のすべてのファイルに対して次のdoコマンドを実行します。

%G in ('dir /ad /b D:\L1\')指定されたディレクトリ内の各フォルダのベアフォーマットとして設定された変数

ディレクトリの%G値とワイルドカードを使用してコマンドを削除する


まずはテスト実行

echo で実行すると、実際にコマンドを実行せずにテストするために実行されるコマンドがコンソールに出力されます。

for /f %G in ('dir /ad /b D:\L1\') do echo del D:\L1\%G\L3\*.txt

関連情報