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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

319閲覧

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

pokopon

総合スコア7

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

1クリップ

投稿2018/04/02 12:41

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~)の数を数えたり
といった処理を入れれば解決できそうなのですが…

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

投稿2018/04/03 00:36

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pokopon

2018/04/03 10:47

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

2018/04/03 11:48 編集

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

2018/04/03 12:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問