質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

Windows batを用いたファイルの一括削除について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 733

pokopon

score 7

Windowsで以下のようなデータ削除用バッチを作成したのですが
一部のファイルが削除できず、困っています。
解決方法について、どなたかご教示いただけないでしょうか。

<概要>
処理の内容:
ファイル名に"_"を含むtxtファイルがあり、
ファイル名には果物名が含まれている。
特定の果物名が含まれるtxtファイルを一括削除したい。

具体的には、
①「in.csv」を"_"で区切り、削除対象の果物名を読み込む。
②削除対象ファイルが存在するフォルダのdirを取得する。
③dir結果を1行ずつ"_"で区切って果物名を抽出する。
④「in.csv」とdir結果の果物名が一致する場合、
絶対パス指定でファイルを削除する。

削除対象のファイル名(イメージ):
D:\~\~\~~~\A_BBB_CCC_DDD_EEE_F.txt
・果物名は"BBB"部分。
・"BBB"、"CCC"には"_"が含まれることがある。
・各ファイルは別々のフォルダに格納されている。

<困っていること>
・"BBB"、"CCC"にあたる箇所に"_"が含まれる場合、
dir結果、in.csvから果物名を抽出できない。

(処理抜粋)

set IN_CSV=in.csv
set IN_CSV_PATH=C:\~\~\~~~

REM in.csvから果物名を抽出
pushd %IN_CSV_PATH%
for /F "tokens=2 delims=_" %%n in (in.csv) do (
REM dummyline
)

REM work用カレント(C:\work)を変数に保持
for /F "usebackq" %%i in (cd) do (
set WORK="%%i"
)

pushd D:\~\~\~~~
set  FLAG=0

REM in.csvから果物名を抽出、ループ処理
REM dirで取得したファイル名に該当の果物名が含まれていれば削除
set FLAG2=0
REM 抽出
for /F "usebackq tokens=2 delims=_" %%n in (type %WORK%\%IN_CSV%) do (
REM 発見したファイルごとに削除
for /F "usebackq tokens=1-10 delims=_" %%a in (dir /s /b) do (
if %%~xf == .txt (
if %%n == %%b (
set FLAG2=1
del %%a_%%b_%%c_%%d_%%e_%%f
)
)
)
REM dirを1ループして一致しない場合はエラー
if !FLAG2! == 0 (
echo [!date! !time!] 「%%n」の該当ファイルは存在しませんでした
)
set FLAG2=0
)

==========================

(in.csv)
A_りんご
A_みかん
A_いちご
A_ばなな
A_キ_ウイ
A_キ_ウ_イ

※どこかで"_"の数を数えたり、変数(%%a~)の数を数えたり
といった処理を入れれば解決できそうなのですが… 

以上、よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

具体的なコードは割愛しますが、以下のように改善してみてはいかがでしょうか。

  • in.csvから果物名を抽出する際、デリミタ_で分割するのではなく、3文字目以降を果物名とする(1項目目が1文字の前提)
  • 抽出した果物名でファイルを削除する際、dir /s /bの抽出結果を自力で判定するのではなく、dir /s /b *果物名*で抽出したものを無条件で削除する
  • そもそも値にデリミタを含んでいるのがおかしいので、in.csvのフォーマットを見直す(csvの名の通りカンマ区切りにするなど)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/03 19:47

    ご回答ありがとうございます。
    csvのフォーマットを見直したら読み込めるようになりました!

    ただ、削除対象のファイルは絶対パス指定&拡張子指定かつ、
    ファイル名の"(1文字)_"の直後に果物名が入っているもののみと
    したいと考えています。
    ワイルドカードだと絶対パス指定ができなかったような記憶があるので
    もう少し色々試してみたいと思います!
    ご回答いただき、本当にありがとうございました。

    キャンセル

  • 2018/04/03 20:47 編集

    D:\~\~\~~~\?_果実名*.txtとか?

    キャンセル

  • 2018/04/03 21:28

    YAmaGNZさんもコメントありがとうございます。
    そうなんです、絶対パスですと上手くワイルドカードで
    指定できなかっため、dir結果から抽出した
    削除対象のファイル名の一覧を別のcsvに格納して、
    delの引数にすることで一括削除に成功しました!
    (もっと効率のいいやり方があるかもしれませんが・・・)

    お二方ともありがとうございましたm( . . )m

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る