定期的に特定のフォルダ内のファイル名を変更する手段は有るでしょうか?

OSはWindows XPです。
Cドライブ直下に「jpg」フォルダがあります。
そのフォルダには日付と時間を参照した200601200121.jpg等のランダムに
名前が付けられたファイルが午前1時に定期的に40ファイル程度保存されます。
保存されるファイルの数はその時々で変わります。

1.このファイルを午前5時に連番のファイル名01.jpg、....40.jpgに変更したい
のですが実現する方法を教えて下さい。

2.この様な仕様をお知らせしアプリケーションを安価に作成してくれるSOHOの
方が集まるサイトがありましたら教えて下さい。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/01/21 08:49:28
  • 終了:--

回答(6件)

id:tyousann No.1

tyousann回答回数1982ベストアンサー獲得回数542006/01/21 09:08:57

ポイント1pt

■ 複数ファイルの名前を、連番ファイル名に一括リネームする  


ファイル名に規則性がないバラバラのファイル群を、指定した連番ファイル名に一括リネームします。つまり、こういうことです。


aaa.jpg     図01.jpg

bbb.jpg  →  図02.jpg

ccc.jpg     図03.jpg


こういうソフトはあります。

いかがでしょう。

id:k-aki

定期的な時間での変更を希望していますがこちらで出来るのでしょうか?手動ではなく決まった時間に自動で変更したいのです。

2006/01/21 09:37:41
id:utagawh No.2

utagawh回答回数114ベストアンサー獲得回数32006/01/21 12:17:32

ポイント1pt

urlはダミー


決まった時間に処理を実行するのであればコントロールパネルの「タスク」で登録すればいいかと。

id:k-aki

何をどのように「タスク」に登録すれば質問している方法を実現出来るか詳しく教えて頂けませんか?

2006/01/21 12:38:13
id:dungeon-master No.3

dungeon-master回答回数571ベストアンサー獲得回数402006/01/21 14:53:47

ポイント35pt

http://www.vector.co.jp/soft/win95/util/se179649.html

x_rename ファイル名変更/移動/コピー(Windows95/98/Me / ユーティリティ)

ご質問の1についてのみお答えします。

x_renameというツールがあります。

ツールを起動しっぱなしになりますが、定時起動の機能があります。

連番は、/?という記法により既存のファイルの番号から継続してつけられます。


ご質問にあるファイル名変更は以下のように実現できると思います。

詳しくは、Helpをご覧ください。


1 ツール→スケジュール実行を押す

2 スケジュール実行Windowが開いたら、追加ボタンを押す。

3 条件設定Windowが開きます。

(1) ファイル名欄にx_rename.exeがパスと共に指定されていることを確認し、

ファイル数のラジオボタンをOnにします。※この条件設定は適当です。

(2) 一番下の繰り返し回数を任意に設定して「次へ」を押します。

4 実行設定Windowが開きます。

(1) 変換元フォルダを指定します。

(2) 変換元ファイルに*.jpgを指定します。(ランダムとの事なので)

(3) ソートを適当に指定します。

(4) 名前変換の<名前の付け方>に、規則を指定します。

  01.jpg~40.jpgなら /??/E で良いと思います。

(5) 実行方法で移動をOnにして、出力先を指定します。

  (上で指定した変換元ファイルは変換後のファイル名も該当してしまうので

  変換後のファイルは別フォルダに作成する必要があるかと思います。)

(6) 連番設定の開始値に1を指定。

(7) 登録ボタンを押します。

5 操作はスケジュール実行Windowに戻ります。

(1) 実行時刻指定のラジオボタンをOnにして、05:00:00を指定します。

(2) 最後に「実行」ボタンを押します。


スケジュール実行Windowを終了すると設定はきえてしまいますが、実行設定

のところで、ファイル→ファイル保存…で、設定保存ができます。

過去に保存した設定で作業したい場合、条件設定Windowで読み込んでください。

実行時刻などは入れ直しです。


なお、変換元フォルダや出力先の指定を間違えると大変なことになります。

くれぐれも注意してください。

できるだけ、バックアップなどを行ってから試してください。

id:k-aki

まだ良く見ていませんがなんとかなりそうです。ありがとうございます。

2006/01/21 18:50:03
id:harg No.4

harg回答回数35ベストアンサー獲得回数02006/01/21 15:02:03

ポイント35pt

http://rubyforge.org/frs/?group_id=167

RubyForge: One-Click Ruby Installer: Project Filelist

ファイル処理であれば、rubyというスクリプト言語を用いて、処理を自動化できます。

URLから、ruby182-15.exeというファイルをダウンロードして、実行環境をインストールすることができます。インストールは、特に詳しいことがわからなければ、ruby182-15.exeを起動してnext連打で問題ありません。


rubyをインストールし終わったら、次の内容をメモ帳などで、処理したいファイルのあるディレクトリ(今回はC:¥ですね)にrename.rbなど名前をつけて保存します。


▼この行の下から


require ’find’


def isfile(path, ext)

reg = Regexp.compile(’^¥.¥/([¥w]+)¥.’+ext+’$’)

if (reg =~ path) != nil then

return true

else

return false

end

end


prefix = $*[0]

ext = $*[1]


if (prefix == nil || ext == nil) then

puts ”--使い方--”

puts ”ruby rename.rb [prefix] [ext]”

puts ”[prefix] -- 接頭辞 [ext] -- 拡張子”

puts ”このスクリプトがあるフォルダ内の、拡張子が[ext]であるファイルが対象となります。”

puts ”ファイルは[prefix] + 数字 + . + [ext]という名前にリネームされます。”

puts ”リネーム後の名前のファイルがすでに存在する場合、実行は中止されます。”

puts ”リネーム前のファイル名には、半角英数字のみ使用できます。”

puts ”リネーム後のファイル名には、全角文字も使うことができます。”

exit

end


files = Array.new

renamedfiles = Array.new


Find.find(’./’) {|file|

if isfile(file, ext) then

files.push file

end

}


len = files.length.to_s.length

i = 0

files.each{||

renamedfiles[i] = ’./’ + prefix+(”0” * (len - i.to_s.length))+i.to_s+’.’+ext

if FileTest.exist?(renamedfiles[i]) then

puts renamedfiles[i] + ”というファイルがすでに存在します。”

puts ”プログラムを終了します。”

exit

end

i+=1

}


i = 0

files.each{|file|

if File.rename(file, renamedfiles[i]) != 0 then

puts file + ” -> ” + renamedfiles[i] + ”:失敗!”

end

i += 1

}


▲この行の上まで


プログラムを実行するには、スタート -> ファイル名を指定して実行で

ruby -C C:¥ C:¥rename.rb test jpg

とすれば、拡張子jpgのファイルがtest00.jpg, test01.jpg, ...というようにリネームされます。

testやjpgの部分を変更すれば、他の種類のファイルにも使えます。

タスクで実行するには、ウィザードが使えないので、タスクを開いて

ファイル->新規->タスクで作成して、プロパティから実行するファイル名に

ruby -C C:¥ C:¥rename.rb test jpg

と入力して、あとは実行する時刻等を設定してください。


このプログラムはあくまでもサンプルとして作ったので、しっかりと検証をしていません。よって、このプログラムの使用によって万一損害が生じても、責任は取れませんのであしからず。

id:k-aki

プログラムまで書いて頂きありがとうございます。

このような方法もあるんですね。非常に勉強になります。

もう少し回答を待ってみます。

2006/01/21 18:52:38
id:bonlife No.5

回答回数421ベストアンサー獲得回数752006/01/22 00:20:52

簡単なコマンドラインツールをVisual Basic 2005 Express Edition使って作ってみました。

.NET Framework 2.0が必要になります。

(VB 2005 Express Editionは無料で公開されてますので、使ってみてはいかがでしょう。)


URLのファイルをDL後、展開してsetup.exeをダブルクリックすると

C:¥Documents and Settings¥ユーザー名¥My Documents¥Visual Studio 2005¥Projects¥simple_renamer¥simple_renamer

あたりにsimple_renamer.exeがインストールされると思います。

ユーザー名の部分は適宜読み替えてください。

(恥ずかしながらClickOnceの仕組みがよく分かっていないのでどこにインストールされるのかは理解できてません…。)


使い方は


・第1引数にフォルダ名 (C:¥jpg)

・第2引数に対象ファイル名 (*.jpg)

・第3引数にファイルの先頭につける文字 (不要であれば””)

・第4引数に拡張子 (jpg)

・第5引数に連番の桁数 (2)


と5つ引数を渡して実行してください。

括弧内はサンプルです。


エラー処理などほとんど行ってません。

リネームできない場合(変換後の名前がすでに存在する場合)にはエラーで終了してしまいます。

また、連番は実行ごとに0からはじめるのではなく、前回の続きの番号になります。

(checknumというファイルを生成しているので、そのファイルの内容を0に書き換えれば、0からの連番を生成します。)

http://ykr414.com/dos/bat.html

コマンドプロンプトを使ってみよう! −バッチファイルとは?−

simple_renamerを動かすためのバッチを作っておいて、それをタスクに登録すれば上記の要望通りのことが実現できると思います。


バッチの例は以下の通りです。

以下の内容を sample.bat などとして保存し、タスクに登録してください。

(下記の例では簡単なログをsample.logに出力しています。)


echo --------------------------------------------------------------------------->> sample.log

echo START>> sample.log

echo DATE : %date% %time%>> sample.log

”C:¥Documents and Settings¥ユーザー名¥My Documents¥Visual Studio 2005¥Projects¥simple_renamer¥simple_renamer¥bin¥Release¥simple_renamer” C:¥jpg *.jpg ”” jpg 2 >> sample.log

echo END>> sample.log

URLはダミーです。

本当はVisual Basic 2005 Express Editionでそのまま開けるようにプロジェクトファイルを保存したら良いのでしょうが、ちょっとどれが対象のファイルか分からなかったので、メインの処理のソースファイルを以下に公開します。


Module Module1


Sub Main(ByVal CmdArgs() As String)

’ 引数のチェック

If CmdArgs.GetLength(0) <> 5 Then

Console.WriteLine(””)

Console.WriteLine(” file_rename Path TargetFile HeaderName ExtentionName DigitNumber”)

Console.WriteLine(””)

Console.WriteLine(” All 5 arguments are needed.”)

Console.WriteLine(”---------------------------------------------------------------------------”)

Console.WriteLine(” Path : File path”)

Console.WriteLine(” TargetFile : Target file name”)

Console.WriteLine(” HeaderName : Head of file name”)

Console.WriteLine(” ExtentionName : Extention name”)

Console.WriteLine(” DigitNumber : Number of digit which is used for sequential number”)

Console.WriteLine(”---------------------------------------------------------------------------”)

Exit Sub

End If

’ 変数の設定、引数を変数にセット

Dim MyPath As String

Dim TargetFile As String

Dim FileHeadName As String

Dim ExtentionName As String

Dim DigitNumber As Integer


MyPath = CmdArgs(0)

TargetFile = CmdArgs(1)

FileHeadName = CmdArgs(2)

ExtentionName = CmdArgs(3)

DigitNumber = CmdArgs(4)

Console.WriteLine(”---------------------------------------------------------------------------”)

Console.WriteLine(”Path : ” & MyPath)

Console.WriteLine(”TargetFile : ” & TargetFile)

Console.WriteLine(”HeaderName : ” & FileHeadName)

Console.WriteLine(”ExtentionName : ” & ExtentionName)

Console.WriteLine(”DigitNumber : ” & Format(DigitNumber, ”#”))

Console.WriteLine(”---------------------------------------------------------------------------”)

’ 処理の開始

Dim NumberFormat As String

Dim FileListArray() = New String() {}

Dim FileListArrayAfterChange() = New String() {}

Dim i, j As Integer

NumberFormat = ””

’ DigitNumberから数値フォーマット用の00...を生成

i = 0

Do While i < DigitNumber

NumberFormat = NumberFormat & ”0”

i = i + 1

Loop

’ 変換前、変換後の名前を保存する配列の初期化

’ counterにファイル一覧を取得し、その件数を配列にセット

Dim counter As System.Collections.ObjectModel.ReadOnlyCollection(Of String)

counter = My.Computer.FileSystem.GetFiles(MyPath, FileIO.SearchOption.SearchTopLevelOnly, TargetFile)

ReDim FileListArray(counter.Count)

ReDim FileListArrayAfterChange(counter.Count)

’ 連番の設定

’ checknumというファイルから読み込む

’ checknumが存在しない場合は、checknumに”0”をセットして生成

Dim StartNum As Integer

Dim checkFile As String

checkFile = Dir$(MyPath & ”¥checknum”)

If checkFile <> ”checknum” Then

My.Computer.FileSystem.WriteAllText(MyPath & ”¥checknum”, ”0”, False)

End If

StartNum = My.Computer.FileSystem.ReadAllText(MyPath & ”¥checknum”)

’ 対象ファイルの一覧をFileListArray()にセット

’ 設定に合わせてリネーム

j = 0

For Each FileName As String In My.Computer.FileSystem.GetFiles(MyPath, FileIO.SearchOption.SearchTopLevelOnly, TargetFile)

FileListArray(j) = FileName

My.Computer.FileSystem.RenameFile(FileName, FileHeadName & Format(StartNum, NumberFormat) & ”.” & ExtentionName)

’ リネーム設定を元に、変換後ファイル名を取得

For Each NewFileName As String In My.Computer.FileSystem.GetFiles(MyPath, FileIO.SearchOption.SearchTopLevelOnly, FileHeadName & Format(StartNum, NumberFormat) & ”.” & ExtentionName)

FileListArrayAfterChange(j) = NewFileName

Next

’ 変換前、変換後の対比を出力

Console.WriteLine(FileListArray(j) & ” -> ” & FileListArrayAfterChange(j))

j = j + 1

StartNum = StartNum + 1

Next

Console.WriteLine(”---------------------------------------------------------------------------”)

’ 次回連番開始の値(StartNum)をchecknumファイルに記録

Dim inputString As String = Format(StartNum, ”#”)

My.Computer.FileSystem.WriteAllText(MyPath & ”¥checknum”, inputString, False)

End Sub


End Module


プログラミング素人なので冗長なソースになっていると思いますが、ご容赦くださいませ。

id:k-aki

ありがとうございます

2006/01/23 20:47:59
id:bonlife No.6

回答回数421ベストアンサー獲得回数752006/01/23 12:02:20

ポイント35pt

http://dotnetfan.org/blogs/dotnetfanblog/archive/2005/07/12/170....

どっとねっとふぁんBlog : ClickOnceの実験(Part2)

度々失礼いたします。

exeファイルがインストールされるフォルダの説明が不正確でした。

(前回の回答でお伝えした推測は、開発者用に生成されるファイルだったようです。)


C:¥Documents and Settings¥ユーザー名¥Local Settings¥Apps¥


以下のどこかにsimple_renamer.exeというファイルが保存されているはずです。

実行場所に依存するような処理を行っているわけではありませんので、適当なフォルダにコピーして使っていただければ良いかと思います。

(使い方として正しいかどうかは別として動きます。)

.NET Framework 2.0がインストールされていれば実行ファイルだけでも動きます。

”プログラムの追加と削除”にてsimple_renamerは削除していただいた上で、上記のファイルをダウンロード、展開していただき、そこに含まれるsimple_renamer.exeを実行してみてください。


引数の数が正しくない場合に表示する内容に一部誤りがありますが、出先から修正できないため、ご了承ください…。


(file_rename Path TargetFile HeaderName ExtentionName DigitNumber

と表示される最初のfile_renameはsimple_renamerと修正すべきでしたが、忘れておりました。orz)

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません