• ベストアンサー

自動でリネームするバチファイルの作り方

ファイル名の変更を自動で行うバッチファイルを作りたいのでですがどなたかお知恵を貸してください。 ・あるネットワーク上のフォルダには随時ファイルが書き込まれます。 ・そのフォルダを監視し、追加された事を検知するとバッチファイルを自動的に実行します。  (この処理はフリーソフトで実現できるようです) バッチファイルで実現したい事はその追加されたファイルの名前の先頭部分(固定長)を切り取る事です。 ファイル名のフォーマット xxxxxxxxxxxx-yymmdd-hhmmss.txt 上記のファイル名の先頭のxxxの部分をハイフンまで切り取りたいのです。 先頭部分を切り取ってもファイル名が重複する事はありません。 元のファイル名の書式を変更する手段はないので書き込まれた後で変更するしかありません。 つまり、フォルダ上にあるファイルの名前の長さを判定し、規定値を超えていたら切り取り(リネーム)をするという事です。 一度にいくつのファイルが書き込まれるかは分かりませんので該当するファイルがある限り処理をする必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

具体的に書いてないので、「20文字以上だったら、16文字目以降を残す(1文字目から15文字目までを削除」ということにします。 (ファイル名には空白は無いものとして簡易化してます) rem 拡張子がTXTのすべてのファイルについて処理 for %%F in (*.txt) do call :sub %%F goto :EOF rem 処理の中身 :sub set A=%~1 rem 21文字目以降が無ければ何もしない if "%A:~20" == "" goto :EOF rem 16文字目以降を取り出す set B=%A:~15% rem リネーム ren %A% %B% goto :EOF

kunisada
質問者

お礼

回答ありがとうございました。 この方法でうまく行きました。 処理を実現するために半日以上もかけてフリーソフトを探していましたが、バッチファイルでこんなに簡単に実現できるとは感激です。

kunisada
質問者

補足

先ほどお礼を書いたのですが、その後改めて動作確認したところ、ファイル名の長さが正常に判定されず、一度処理したファイルが次に実行した時も対象になってしまい、ファイル名がどんどん短くなってしまいます。 ファイル名が一定の長さ以上かどうかを正確に判断するにはこのコードではうまく動作しないのでしょうか?

その他の回答 (3)

  • orangezzzz
  • ベストアンサー率35% (401/1119)
回答No.4

こんにちは。#1です。 >質問を投稿してから調べていたら WSHなどを使って高度なスクリプトが書ける事が分かりました。それを使って上記の処理を実現するにはどうすればいいでしょうか? スクリプトさえできれば、先の監視実行ツールで起動させたら宜しいのでは? バッチファイルも不要かもしれません。

kunisada
質問者

お礼

その方法で実現できました。 ありがとうございます。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.2

setlocal enableextensions enabledelayedexpansion for %%i in (*-*-*.txt) do (   set OLD=%%i   set NEW=!OLD:~-17!   echo !OLD! を !NEW! に rename する )

kunisada
質問者

お礼

ありがとうございました。 希望通りの処理が実現できました。

  • orangezzzz
  • ベストアンサー率35% (401/1119)
回答No.1

こんにちは。 バッチファイルでは無理です。 少なくともVBS(VisualBasicScript)などを利用しなければ。

kunisada
質問者

補足

回答ありがとうございます。 質問を投稿してから調べていたら WSHなどを使って高度なスクリプトが書ける事が分かりました。 それを使って上記の処理を実現するにはどうすればいいでしょうか?

関連するQ&A

  • リネームに適したツールを教えて下さい

    windowsです 以下のようなフォルダの先頭ファイルを、フォルダ名としたいです フォルダ1 └ファイル1 └ファイル2 フォルダ2 └ツール1 └ツール2 処理後 ファイル1 └ファイル1 └ファイル2 ツール1 └ツール1 └ツール2 flexible renamerではこういう処理はできないみたいですが、このような処理がしやすいツールはありますか? cmdよりもlinuxを入れたほうがいいのでしょうか?

  • 自動化したい

    ファイル名の末尾に「_X」を追加し、それを特定のフォルダにコピーする という作業を自動化したいです。 フリーソフトをつかってみましたが、できればバッチファイルのように 軽く、素早くできるものがいいと思い、自分で調べて、つくってみようとしてみましたが、 私には難しく理解できず、全くできませんでした。 どなたかバッチファイルを作成していただけないでしょうか? ファイルをバッチファイルにドラッグ&ドロップすると上記の作業が行われるようにしたいです。 また、元のファイルに上書きせず、新たにファイルを作成したいです。 使用OSはWindowsXPです。 よろしくお願いします。

  • バッチorスクリプトでの削除

    いつもお世話になっております。 ファイルやフォルダの削除について2つ質問があるのですが、 YYMMDD_hhmmssという形式の名前のフォルダがバックアップのために毎日作成されます。 1年間を過ぎたら削除したいのですがYYMMDDの部分だけを抜き出して現在から1年前というような判定の仕方で削除はできませんか? for(YYMMDD_hhmmssフォルダ全て)   if (YY-1)MMDD >= YYMMDD) { //左が現在 右が古いほう    delete!   } } のような感じで書きたいのですが。javaのような書き方ですみません。 もう一つお聞きしたいのが、○○○.csvというファイルがほぼ毎日作られます。 ○○○の箇所はランダムです。 このファイルが作られるフォルダ内で作成日時の新しいものから3つ以外削除したいのですが、こちらはまったく方法がわかりません。 毎日必ず作られるわけではないので、何日間で削除というような書き方ができなくてまったく思いつかない状況です。 こちらもどなたかお教えください。 長くなってしまいましたがよろしくお願いします。

  • バッチファイルでファイル名をリネームのコマンド

    お世話になります。 バッチファイルのコマンドについて質問させていただきます。 【やりたいこと】 AAA.batというバッチファイルと”MU_日付.txt”というテキストがあります。 このテキストの日付部分は毎回変わります。例)MU_111226.txt このバッチファイルとMU_日付.txtは同じ階層にあります。 まず、このAAA.batをクリックしたら、この”MU_111226.txt” を ”読み込み.txt” という名前にリネームします。このリネーム処理の時、テキスト名が”MU”で始まるファイル以外は対象にしないようにしたいのです。 次にある処理を行って、その処理が済んだら”読み込み.txt”を”END_MU_111226.txt”といった元のファイル名に”END_”を付けた形でリネームして、同じ階層にある「処理済み」フォルダへ移動させたいのです。 ”END_” + ”元のファイル名”が無理であれば、”MU_111226.txt”を「処理済み」フォルダへ移動させるだけでも構いません。 このような処理は可能でしょうか? どなたかご教授いただけますでしょうか。よろしくお願い致します。

  • powershellでフォルダのリネーム

    フォルダの先頭のファイル(1が最初)をフォルダ名としたい場合、どんな式になるんでしょうか? 必要な要素は以下だと思います。 1:リネーム対象のフォルダ名 2:フォルダ内の先頭のファイル名 1を2で置き換えたいのです フォルダ1 └file1 └file2 フォルダ2 └hoge1 └hoge2 file1 └file1 └file2 hoge1 └hoge1 └hoge2 こういう結果にしたいのですが、可能ですか? get-childrenでフォルダ一覧が取得出来ますが、そこから進展がないです。

  • バッチファイルでファイル名をリネームのコマンドにつ

    お世話になります。 バッチファイルのコマンドについて質問させていただきます。 【やりたいこと】 AAA.batというバッチファイルと”MU_日付.txt”というテキストがあります。 このテキストの日付部分は毎回変わります。例)MU_111226.txt このバッチファイルとMU_日付.txtは同じ階層にあります。 まず、このAAA.batをクリックしたら、この”MU_111226.txt” を ”読み込み.txt” という名前にリネームします。このリネーム処理の時、テキスト名が”MU”で始まるファイル以外は対象にしないようにしたいのです。 次にある処理を行って、その処理が済んだら”読み込み.txt”を”END_MU_111226.txt”といった元のファイル名に”END_”を付けた形でリネームして、同じ階層にある「処理済み」フォルダへ移動させたいのです。 ”END_” + ”元のファイル名”が無理であれば、”MU_111226.txt”を「処理済み」フォルダへ移動させるだけでも構いません。 このような処理は可能でしょうか? どなたjかご教授いただけますでしょうか。よろしくお願い致します。

  • コピー&リネーム

    こんにちは。仕事で大量の反復作業があるため、マクロでの自動処理を考えています。VBの参考図書を見ながら挑戦してみたのですが、何分初めてなものでなかなかうまくいきません・・・もう時間が無いので、お恥ずかしいのですが教えて頂けないでしょうか。宜しくお願いいたします。 【処理内容】複数のフォルダがあり、各フォルダの同じ階層位置に同名ファイルが存在します。それらを全て一つのフォルダにまとめてコピーするのですが、同名ファイルなのでコピーの際にリネーム処理も同時に行いながらコピーします。リネームのルールは、「親フォルダ名_元ファイル名.元拡張子」です。

  • 複数ファイルの一括名称変更

    ファイル名が1234_200812061.datという形式になっているファイルが大量にあります。このファイル名の先頭部分1234_を削って後半部分200812061.datだけの名称に変更したいのです。 renコマンドを使ってもうまく行かないので恐らくバッチファイルでfor文などを使って処理できると思うのですが、うまく行きません。私が作ったバッチでは for /f "skip=5" %%A in (*.dat) do ren *.dat %%~nA.dat のように処理しているのですが、うまく行かないようです。 どなたかご教授していただけますでしょうか。

  • ファイル名を元にタイムスタンプを変更したい

    ファイル名を元にタイムスタンプを変更したい はじめまして。 ディレクトリ内にある多数のファイルのタイムスタンプの変更したいと考えています。 ファイル数は3000以上あるため、ファイルひとつひとつ touch コマンドではとても間に合いません。 ディレクトリ内のファイル名には次のような規則があります。 ■ ファイル名の規則 20YYmmdd_HHiiss_カメラモデル名_IMG0001.JPG 20YYmmdd_HHiiss_カメラモデル名_IMG0002.JPG 20YYmmdd_HHiiss_カメラモデル名_MVI0003.MP4 20YYmmdd_HHiiss_カメラモデル名_MVI0004.MP4 つまり、ファイル名の先頭部分が更新日時を意味します。 ■ 更新日時がずれる理由 インターネット経由でファイル入手等により、更新日時が「撮影した日時」ではなく「入手した日時」になってしまいます。 「ファイルの更新日時よりも、ファイル名の先頭部分の時間が正確である。」という前提です。 ■ 一括で更新日時を変更 find, grep, touch コマンドを組み合わせれば、ディレクトリ内のファイルを一括処理できるような気がするのですが。 皆様の知恵をお借りできればと思います。 ■ 環境 ・OS Ubuntu 12.04.2 LTS ・シェル /bin/bash

  • コマンドプロンプトのバッチについて

    test01.bat >> YYMMDD結果.txt コマンドプロンプトのバッチ処理を実行結果をテキストで保存したいのですが、ファイル名を、 「YYMMDD結果.txt」と"YYMMDD"に本日の日にちを入れたいのですが、どのようにすればよいのでしょうか?

専門家に質問してみよう